我正在遍历一些数据,并将其附加到csv文件。我想要的是在文件顶部有一个列名,然后循环不重复文件中间的列名。
如果我col.names=T
,它会重复,包括每个新循环的列名。如果我有col.names=F
,则根本没有列名。
如何最有效地完成此操作?我觉得这是一种常见的情况,必须有一种方法可以做到这一点,而无需编写代码来处理它。
write.table(dd, "data.csv", append=TRUE, col.names=T)
答案 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 = FALSE
和row.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
的列为obs
,name
,age
,那么
names(df1) <- c('obs','name','age')
然后尝试
dbWriteTable(conn, 'table_name', df1, append = T, row.names = F)