我正在循环一些数据,并将其附加到csv文件.我想要的是在文件顶部有一个列名,然后循环不重复文件中间的列名.
如果我这样做col.names=T,它会重复,包括每个新循环的列名.如果有col.names=F,则根本没有列名.
我如何最有效地完成这项工作?我觉得这是一种常见的情况,必须有一种方法可以做到这一点,而无需编写代码来处理它.
write.table(dd, "data.csv", append=TRUE, col.names=T)
Run Code Online (Sandbox Code Playgroud)
C8H*_*4O2 21
见?file.exists.
write.table(dd, "data.csv", append=TRUE, col.names=!file.exists("data.csv"))
Run Code Online (Sandbox Code Playgroud)
因此,只有在未附加到已存在的文件时才会写入列名.
您可能会也可能不会看到行名称相同的问题,因为write.table在附加时不允许使用相同的行名称。你可以试试这个。在第一次写入文件时,只尝试write.table使用row.names = FALSE。然后,从第二次写入文件开始,同时使用 col.names = FALSE和row.names = FALSE
这是第一次写入文件
> d1 <- data.frame(A = 1:5, B = 1:5) ## example data
> write.table(d1, "file.txt", row.names = FALSE)
Run Code Online (Sandbox Code Playgroud)
我们可以检查它read.table("file.txt", header = TRUE)。然后我们可以将相同的数据框附加到该文件中
> write.table(d1, "file.txt", row.names = FALSE,
col.names = FALSE, append = TRUE)
Run Code Online (Sandbox Code Playgroud)
我们可以再次检查它 read.table("file.txt", header = TRUE)
因此,如果您有一个数据帧列表,例如dlst,将数据帧附加在一起的代码块可能看起来像
> dlst <- rep(list(d1), 3) ## list of example data
> write.table(dlst[1], "file.txt", row.names = FALSE)
> invisible(lapply(dlst[-1], write.table, "file.txt", row.names = FALSE,
col.names = FALSE, append = TRUE))
Run Code Online (Sandbox Code Playgroud)
但正如@MrFlick 所建议的,最好将数据帧附加到 R 中,然后将它们发送到文件中。这将消除写入文件时可能发生的许多可能的错误/问题。如果数据在列表中,则可以使用
> dc <- do.call(rbind, dlst)
> write.table(dc, "file.txt")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14493 次 |
| 最近记录: |