读取文件列表,应用函数并使用相同名称重写

时间:2013-10-11 09:02:04

标签: r csv

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

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

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

我坚持将列表中的数据框分开并用同名重写。还有一个类似的问题,我试了几个小时但却无法理解这些问题。

3 个答案:

答案 0 :(得分:4)

我肯定会使用for循环。嘘,不要告诉任何人我说的那样。为什么?有三个原因......

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

    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))