有没有一种有效的方法可以附加到现有的 csv 文件而不在 R 中重复?
Is there an efficient way to append to an existing csv file without duplicates in R?
有一个 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);
所以理想情况下,输出文件应该只保留一个 df1 副本。但是 write.table 函数没有任何用于重复检查的参数。
感谢您提前提出任何建议。
> # Original Setup ----------------------------------------------------------
> df1 <- data.frame(name = c('a','b','c'), a = c(1,2,2))
> write.csv(df1, "export.csv", row.names=FALSE, na="NA");
>
> # Add Some Data -----------------------------------------------------------
> df1[,1] <- as.character(df1[,1])
> df1[,2] <- as.numeric(df1[,2])
> df1[4,1] <- 'd'
> df1[4,2] <- 3
>
> # Have a Look at It -------------------------------------------------------
> head(df1)
name a
1 a 1
2 b 2
3 c 2
4 d 3
>
> # Write It Out Without Duplication ----------------------------------------
> write.table(df1, "export.csv", row.names=F, na="NA",
+ append = F, quote= FALSE, sep = ",", col.names = T)
>
> # Proof It Works ----------------------------------------------------------
> proof <- read.csv("export.csv")
> head(proof)
name a
1 a 1
2 b 2
3 c 2
4 d 3
您可以交替关注建议 rbind
的问题的评论,或者简单地使用 write.csv
或 write.table
和 append = T
选项,确保正确处理行和列名。
但是,我也建议使用 and readRDS
和 saveRDS
并仅覆盖 rds
对象而不是追加作为最佳实践。 Hadley 和 R 中的其他知名人士推荐使用 RDS
。
您可以从文件中读取 data.frame,rbind
它与新的 data.frame 并检查重复值。为了提高写入效率,只追加不重复的行。
如果您提出这个问题是因为您正在处理大数据集并且 read/write 时间很重要,请查看 data.table
和 fread
包。
# 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)
有一个 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);
所以理想情况下,输出文件应该只保留一个 df1 副本。但是 write.table 函数没有任何用于重复检查的参数。
感谢您提前提出任何建议。
> # Original Setup ----------------------------------------------------------
> df1 <- data.frame(name = c('a','b','c'), a = c(1,2,2))
> write.csv(df1, "export.csv", row.names=FALSE, na="NA");
>
> # Add Some Data -----------------------------------------------------------
> df1[,1] <- as.character(df1[,1])
> df1[,2] <- as.numeric(df1[,2])
> df1[4,1] <- 'd'
> df1[4,2] <- 3
>
> # Have a Look at It -------------------------------------------------------
> head(df1)
name a
1 a 1
2 b 2
3 c 2
4 d 3
>
> # Write It Out Without Duplication ----------------------------------------
> write.table(df1, "export.csv", row.names=F, na="NA",
+ append = F, quote= FALSE, sep = ",", col.names = T)
>
> # Proof It Works ----------------------------------------------------------
> proof <- read.csv("export.csv")
> head(proof)
name a
1 a 1
2 b 2
3 c 2
4 d 3
您可以交替关注建议 rbind
的问题的评论,或者简单地使用 write.csv
或 write.table
和 append = T
选项,确保正确处理行和列名。
但是,我也建议使用 and readRDS
和 saveRDS
并仅覆盖 rds
对象而不是追加作为最佳实践。 Hadley 和 R 中的其他知名人士推荐使用 RDS
。
您可以从文件中读取 data.frame,rbind
它与新的 data.frame 并检查重复值。为了提高写入效率,只追加不重复的行。
如果您提出这个问题是因为您正在处理大数据集并且 read/write 时间很重要,请查看 data.table
和 fread
包。
# 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)