我有一组带有重复条目的csv文件,我需要删除并重写具有相同名称和格式的文件。
这是我到目前为止所做的,
filenames<-list.files(pattern =".csv")
datalist <-lapply(filenames, function(x){read.csv(file=x,header=F)})
unique.list <- lapply(datalist,unique)
我坚持将列表中的数据框分开并用同名重写。还有一个类似的问题,我试了几个小时但却无法理解这些问题。
答案 0 :(得分:4)
我肯定会使用for
循环。嘘,不要告诉任何人我说的那样。为什么?有三个原因......
write.csv
它的副作用,而不是它的返回值,即您希望将文件写入磁盘。如果需要函数的返回值,请使用*apply
。for
循环相比,我预计使用*apply
循环不会产生性能开销。*apply
函数将在循环的每次迭代中吞下内存,并且不保证在所有迭代完成之前将其释放。在for
循环中,如果要覆盖循环内的对象,则在下一次迭代开始时释放内存。如果您正在使用大csv
个文件,这可能是一个优势。我会尝试找到一个答案的链接,其中for
解决了lapply
因内存问题而无法解决的问题。所以你需要我的解决方案,因为你的重复数据列表是......
for( i in 1:length( filenames ) ){
write.csv( unique.list[[i]] , filenames[[i]] )
}
Here is an answer需要for
循环,因为lapply
等效项遇到了内存分配错误。
答案 1 :(得分:3)
现在无法对其进行测试,这是一种在lapply
循环中完成所有必需内容的方法。修订后的数据将作为列表存储在名为datalist
的变量中。
filenames <- list.files(pattern =".csv")
datalist <- lapply(filenames, function(x) {
# Import data
tmp <- read.csv(file = x, header = F)
# Remove duplicated entries
if (any(duplicated(tmp)))
tmp <- tmp[-which(duplicated(tmp)), ]
# Write output
write.csv(tmp, x)
# Return revised data
return(tmp)
})
答案 2 :(得分:2)
一种方法是使用mapply
:
mapply(function(filename, data) write.csv(data, file=filename),
filenames,
unique.list)
请注意,如果您不修改filenames
,则会覆盖原始数据文件。
mapply
将返回一个空列表。由于您只使用该功能的副作用,如果您愿意,可以将其包装在invisible
内:
invisible(mapply(function(filename, data) write.csv(data, file=filename),
filenames,
unique.list))