是否有一种有效的方法可以在R中附加到现有的csv文件而不重复?

YYY*_*YYY 2 csv r append dataframe write.table

有一个data.frame附加到现有文件.当它被write.table函数追加时,它可能会导致重复的记录进入文件.以下是示例代码:

df1<-data.frame(name=c('a','b','c'), a=c(1,2,2))
write.csv(df1, "export.csv", row.names=FALSE, na="NA"); 

#"export.csv" keeps two copies of df1
write.table(df1,"export.csv", row.names=F,na="NA",append=T, quote= FALSE, sep=",", col.names=F);
Run Code Online (Sandbox Code Playgroud)

因此理想情况下,输出文件应该只保留df1的一个副本.但write.table函数没有任何重复检查参数.

感谢您提前提出任何建议.

小智 8

您可以从文件中读取data.frame,rbind使用新的data.frame并检查重复值.为了提高写入效率,仅附加非重复行.

如果您提出这个问题是因为您正在处理大数据集并且读/写时间很重要,请查看data.tablefread打包.

# initial data.frame
df1<-data.frame(name=c('a','b','c'), a=c(1,2,2))
write.csv(df1, "export.csv", row.names=FALSE, na="NA")

# a new data.frame with a couple of duplicate rows
df2<-data.frame(name=c('a','b','c'), a=c(1,2,3))
dfRead<-read.csv("export.csv") # read the file
all<-rbind(dfRead, df2) # rbind both data.frames
# get only the non duplicate rows from the new data.frame
nonDuplicate <- all[!duplicated(all)&c(rep(FALSE, dim(dfRead)[1]), rep(TRUE, dim(df2)[1])), ]
# append the file with the non duplicate rows
write.table(nonDuplicate,"export.csv", row.names=F,na="NA",append=T, quote= FALSE, sep=",", col.names=F)
Run Code Online (Sandbox Code Playgroud)