【问题标题】:Write .csv in a for loop在 for 循环中写入 .csv
【发布时间】:2016-09-30 02:02:26
【问题描述】:

我想在 for 循环中编写 csv 文件。假设我有一个包含 3 行的数据框 data,为简单起见,变量 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"))
 }

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

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

【问题讨论】:

  • 也许我数错了,但你的引号似乎有些不对劲。您是否按 1:1 复制并粘贴了代码?
  • nrow(data) 是一个数字,而不是一堆要迭代的数字。您需要1:nrow(data)seq(nrow(data))。或者只使用lapply。另外,您在"data[i,1] 上有一个额外的报价。
  • @Rafael 的回答太棒了。但我怀疑它可能过于复杂,无法说明您的代码为什么不起作用。查看下面的代码并将其与您自己的代码进行比较。注意我在哪里使用撇号。 for (i in 1:nrow(data)) { write.csv(data[i,2], file = paste0("Directory/", data[i,1], ".csv")) } 另外,R 中的一般提示。永远不要将您的数据称为“数据”。如果需要,可以将其称为“dat”或“data1”。

标签: r csv for-loop export-to-csv


【解决方案1】:

无需使用循环。您可以使用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) ]

让事情变得更快

# 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) ]

使用循环

# 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"))
                      }

额外:按组而不是按行保存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) ]

* 附言。请注意,fwrite 仍处于 data.table 1.9.7 的开发版本中。前往here 获取安装说明。

【讨论】:

  • 您好 Rafael,感谢您的回复,但我仍然不知道该怎么做。我一直收到以下错误:“[.data.frame(vazao_total, , write.csv(copy(.SD)[, :=mun, : 未使用的参数 (by = mun)) 中的错误”。在这里,我的 ID 或 V1会是 mun。也许我没有看到任何东西......我会继续尝试,如果我找到发生这种情况的原因,请告诉你。另外,我尝试过 fwrite(在通过安装 {data.table} github),但它也不起作用。
  • 嗨@rebeca,我对代码做了一个小的更正,现在它应该可以工作了。不要忘记使用library(data.table)setDT(yourdata)
猜你喜欢
  • 2018-01-19
  • 1970-01-01
  • 2013-08-28
  • 2017-11-30
  • 2018-01-12
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多