在 for 循环中写入 .csv

reb*_*eca 1 csv for-loop r export-to-csv

我想在 for 循环中写入 csv 文件。data为了简单起见,假设我有一个包含 3 行变量的数据框x。最后,我希望输出为 200 个 .csv 文件,每个文件包含一行数据。数据的第一列是我的变量的标识(“ID”)。

此外,我的数据描述如下:

  data:

     ID x
 [1] a  1
 [2] b  2
 [3] c  3 

 for (i in nrow(data)){
   write.csv(data[i,2], file = paste0("Directory/", "data[i,1], ".csv"))
 }
Run Code Online (Sandbox Code Playgroud)

我运行此代码并创建一个 csv 文件。但是,仅创建了最后一行,这意味着我发现只有一个文件c.csv

你知道我做错了什么吗?我以为它会自动创建所有档案。我应该先将结果保存在列表中然后导出吗?

raf*_*ira 5

无需使用循环。您可以使用一种data.table更有效、更快速的方法。

library(data.table)

# create a column with row positions
setDT(dt)[, rowpos := .I]

# save each line of your dataset into a separate .csv file
dt[, write.csv(.SD, paste0("output_", rowpos,".csv")), 
                  by = rowpos, .SDcols=names(dt) ]
Run Code Online (Sandbox Code Playgroud)

让事情变得更快

# Now in case you're working with a large dataset and you want
# to make things much faster, you can use `fwrite {data.table}`*

dt[, fwrite(.SD, paste0("output_", rowpos ,".csv")), 
               by = rowpos, .SDcols=names(dt) ]
Run Code Online (Sandbox Code Playgroud)

使用循环

# in case you still want to use a loop, this will do the work for you:

for (i in 1:nrow(dt)){
                      write.csv(dt[i,], file = paste0("loop_", i, ".csv"))
                      }
Run Code Online (Sandbox Code Playgroud)

额外:dataframe组而不是按行保存子集

# This line of code will save a separate `.csv` file for every ID 
# and name the file according to the ID


 setDT(dt)[, fwrite(.SD, paste0("output_", ID,".csv")), 
                       by = ID, .SDcols=names(dt) ]
Run Code Online (Sandbox Code Playgroud)

* 附言。请注意,fwrite仍处于开发版本中data.table 1.9.7。转到此处获取安装说明。