在write.table中追加数据时使用列名

use*_*606 10 r

我正在循环一些数据,并将其附加到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)

因此,只有在未附加到已存在的文件时才会写入列名.


Ric*_*ven 5

您可能会也可能不会看到行名称相同的问题,因为write.table在附加时不允许使用相同的行名称。你可以试试这个。在第一次写入文件时,只尝试write.table使用row.names = FALSE。然后,从第二次写入文件开始,同时使用 col.names = FALSErow.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)