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

时间:2014-06-27 23:35:32

标签: r

我正在遍历一些数据,并将其附加到csv文件。我想要的是在文件顶部有一个列名,然后循环不重复文件中间的列名。

如果我col.names=T,它会重复,包括每个新循环的列名。如果我有col.names=F,则根本没有列名。

如何最有效地完成此操作?我觉得这是一种常见的情况,必须有一种方法可以做到这一点,而无需编写代码来处理它。

write.table(dd, "data.csv", append=TRUE, col.names=T)

3 个答案:

答案 0 :(得分:20)

请参阅?file.exists

write.table(dd, "data.csv", append=TRUE, col.names=!file.exists("data.csv"))

因此,只有当您没有附加到已存在的文件时才会写入列名。

答案 1 :(得分:3)

您可能也可能不会看到行名称相同的问题,因为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)

我们可以使用read.table("file.txt", header = TRUE)进行检查。然后我们可以使用

将相同的数据框附加到该文件
> write.table(d1, "file.txt", row.names = FALSE, 
              col.names = FALSE, append = TRUE)

我们可以再次使用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))

但正如@MrFlick建议的那样,在R中附加数据帧然后将它们发送到文件一次会好得多。这将消除写入文件时可能发生的许多可能的错误/问题。如果数据在列表中,可以使用

完成
> dc <- do.call(rbind, dlst)
> write.table(dc, "file.txt")

答案 2 :(得分:1)

尝试使用R中的names()命令更改数据框的列名,并使用与现有相同的名称替换,然后尝试dbWriteTable命令保留row.names = False。这个问题将得到解决。 例如
如果您的数据框df1的列为obsnameage,那么

names(df1) <- c('obs','name','age')

然后尝试

dbWriteTable(conn, 'table_name', df1, append = T, row.names = F)