【问题标题】:how to write multiple dataframe to a single csv file in a loop in R?如何在 R 的循环中将多个数据帧写入单个 csv 文件?
【发布时间】:2014-11-17 07:40:55
【问题描述】:

我想在单个 CSV 文件中写入多个数据帧“neighbours_dataframe”:

我使用这一行将多个数据帧写入多个文件:

for(i in 1:vcount(karate)){
write.csv(neighbours_dataframe[[i]], file = as.character(V(karate3)$name[i]),row.names=FALSE)}

如果我使用此代码:

for(i in 1:vcount(karate)){
write.csv(neighbours_dataframe[[i]], file = "karate3.csv",row.names=FALSE)}

这只会给我 csv 文件中的最后一个数据框:

我想知道,我怎么能有一个 CSV 文件,其中的所有数据帧都以第一个数据帧的列标题刚刚写入 csv 文件的方式以及所有其他数据帧以连续方式复制的方式?

提前谢谢你

【问题讨论】:

  • 如果所有 data.frames 具有相同的列名集,请尝试 do.call(rbind, neighbours_dataframe)(假设 neighbours_dataframe 是 data.frames 的列表),然后将结果写入 csv。如果它们不共享相同的列,请尝试dplyr::rbind_all(neighbours_dataframe)
  • 设置append=TRUE,它应该可以工作。
  • @Neal append 不适用于 write.csv - 请参阅下面的 my comment
  • 谢谢@Neal,因为 jbaums 说 append 不起作用,我收到了警告,就像第二行代码一样,什么也没发生
  • 非常感谢@jbaums,它运行良好

标签: r csv


【解决方案1】:

两种方法;如果neighbours_dataframe 是一个很长的列表,第一个可能会快一点(尽管我还没有测试过)。

方法一:先将数据框列表转换为单个数据框

按照 jbaums 的建议。

library(dplyr)
neighbours_dataframe_all <- rbind_all(neighbours_dataframe)
write.csv(neighbours_dataframe_all, "karate3.csv", row.names = FALSE)

方法二:使用循环,追加

正如尼尔·富尔茨所建议的那样。

for(i in seq_along(neighbours_dataframe))
{
  write.table(
    neighbours_dataframe[[i]], 
    "karate3.csv", 
    append    = i > 1, 
    sep       = ",", 
    row.names = FALSE,
    col.names = i == 1
  )
}

【讨论】:

  • append 不能用于 write.csv。请参阅?write.table,其中指出,对于 CSV 文件,“这些包装器故意不灵活:它们旨在确保使用正确的约定来编写有效文件。尝试更改 append、col.names、sep、 dec 或 qmethod 被忽略,并带有警告。”。相反,您可能必须执行以下操作:write.table(neighbours_dataframe[[i]], "karate3.csv", append = i &gt; 1, row.names = FALSE, col.names = i==1, sep=',')(在您的 for 循环内)。
  • @jbaums 好地方;固定。
  • 我认为您确实也需要禁止显示行名,否则列名无法正确对齐。见L &lt;- data.frame(a=1:3, b=1:3); L &lt;- list(d, d); f &lt;- tempfile(fileext='.csv'); for(i in seq_along(L)) write.table(L[[i]], f, append=i&gt;1, sep=",", col.names=i==1); file.show(f)
  • 谢谢@RichieCotton,第一种方法在相当长的列表上工作得很好
猜你喜欢
  • 2021-10-24
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
相关资源
最近更新 更多