4

我有一组带有重复条目的 csv 文件,我需要删除并重写具有相同名称和格式的文件。

这是我到目前为止所做的,

filenames<-list.files(pattern =".csv") 
datalist <-lapply(filenames, function(x){read.csv(file=x,header=F)})
unique.list <- lapply(datalist,unique)

而且我坚持分离列表中的数据框并用相同的名称重写。还有一个类似的问题,我尝试了几个小时但无法理解程序。

4

3 回答 3

4

我肯定会使用for循环。嘘,别告诉任何人我说过。为什么?三个原因...

  1. 您希望调用write.csv它的副作用,而不是返回值,即您希望将文件写入磁盘。*apply当您想要函数的返回值时使用。
  2. 主要瓶颈将是磁盘 I/O,因此for与使用循环相比,我希望使用循环不会产生性能开销*apply
  3. *apply函数将在循环的每次迭代中吞噬内存,并且不能保证在所有迭代完成之前释放它。在for循环中,如果您要覆盖循环内的对象,则会在下一次迭代开始时释放内存。如果您正在处理大csv文件,这可能是一个优势。我将尝试找到一个答案的链接,该链接for解决了lapply由于内存问题而无法解决的问题。

因此,鉴于您的重复数据列表是...

for( i in 1:length( filenames ) ){
  write.csv( unique.list[[i]] , filenames[[i]] )
}

for这是一个需要循环的答案lapply等效项遇到了内存分配错误。

于 2013-10-11T09:37:25.400 回答
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)
})
于 2013-10-11T09:18:20.550 回答
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))
于 2013-10-11T09:11:41.523 回答