使用lapply将数据框列表写入单独的CSV文件

34

这个问题已经说得很清楚了 - 我想要将一个装满data.frames的列表对象写入到单独的.csv文件中,其中.csv文件的名称对应于列表对象的名称。

以下是一个可重现的示例以及我目前编写的代码。

df <- data.frame(
    var1 = sample(1:10, 6, replace = TRUE)
    , var2 = sample(LETTERS[1:2], 6, replace = TRUE)
    , theday = c(1,1,2,2,3,3)
)

df.daily <- split(df, df$theday) #Split into separate days

lapply(df.daily, function(x){write.table(x, file = paste(names(x), ".csv", sep = ""), row.names = FALSE, sep = ",")})

以下是R输出的错误信息顶部:

Error: Results must have one or more dimensions.
In addition: Warning messages:
1: In if (file == "") file <- stdout() else if (is.character(file)) { :
  the condition has length > 1 and only the first element will be used

我在这里漏掉了什么?


重复的问题 https://dev59.com/X0_Ta4cB1Zd3GeqPBo_z - Joshua Ulrich
@Joshua - dar,谷歌搜索失败了。我现在应该回家了。随意关闭这个问题。 - Chase
这并不是完全重复的。你的错误提示表明你正在将多个字符串作为文件名传递给write.table。names(x)返回数据框中所有列名。 - Brandon Bertelsen
3个回答

33

试试这个:

sapply(names(df.daily), 
 function (x) write.table(df.daily[[x]], file=paste(x, "txt", sep=".") )   )

你应该逐个看到名称 ("1", "2", "3") 的输出,但是 NULL 表明了写入磁盘文件的副作用已经发生。(编辑:将 [] 改为 [[]])


感谢提供基于R的解决方案以及使用paste更简洁的方法。 - Chase
我认为应该有 df.daily[[x]] - Marek
在我的机器上,df.daily[x]和df.daily[[x]]给出了相同的结果。不过我可以理解你怀疑的逻辑。 - IRTFM
我认为两种形式都成功的原因是write.table使用as.data.frame()将数据强制转换为data.frame类别,如果对象不是data.frame则进行这个操作将会成功,如果对象是一个包含一个数据框的列表也可以成功。 - IRTFM
对我来说结果不同。在[]版本中,列名有前缀(例如X1.var1),而在[[]]版本中没有。 - Marek

11

你可以使用mapply函数:

mapply(
  write.table,
  x=df.daily, file=paste(names(df.daily), "txt", sep="."),
  MoreArgs=list(row.names=FALSE, sep=",")
)

plyr邮件列表上有一个关于类似问题的讨论


7

几点提示:

laply 对列表执行操作。您需要使用 d_ply。而且,您不必按天数拆分,可以让 plyr 为您完成。此外,我不建议使用 names(x) ,因为它会返回数据框的所有列名。

d_ply(df, .(theday), function(x) write.csv(x, file=paste(x$theday,".csv",sep=""),row.names=F))

我总是不知道为什么会忘记使用带下划线的plyr函数。这个可以解决问题。谢谢! - Chase
这个解决方案对我不起作用。我收到以下错误消息:文件(file, ifelse(append, "a", "w"))中的错误: 无效的“description”参数 另外:警告消息: 在if (file == "") file <- stdout() else if (is.character(file)) {中: 条件长度>1,只有第一个元素将被使用 - zach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接