代码之家  ›  专栏  ›  技术社区  ›  mropa

使用循环将多个data.frame合并为一个data.frame

  •  27
  • mropa  · 技术社区  · 15 年前

    我正在努力 merge 几个 data.frames 合二为一 data.frame . 因为我有一个完整的文件列表,所以我尝试使用循环结构。

    到目前为止,循环方法运行良好。然而,它看起来效率很低,我想知道是否有一种更快更简单的方法。

    以下是场景: 我有一个目录,上面有几个 .csv 所以我用 list.files 并读入前两个文件。后来我用 合并 得到一个 .

    FileNames <- list.files(path=".../tempDataFolder/")
    FirstFile <- read.csv(file=paste(".../tempDataFolder/", FileNames[1], sep=""),
                 header=T, na.strings="NULL")
    SecondFile <- read.csv(file=paste(".../tempDataFolder/", FileNames[2], sep=""),
                  header=T, na.strings="NULL")
    dataMerge <- merge(FirstFile, SecondFile, by=c("COUNTRYNAME", "COUNTRYCODE", "Year"),
                 all=T)
    

    现在我用一个 for 循环以获取所有剩余的 .csv 将它们转换为现有的 数据帧 :

    for(i in 3:length(FileNames)){ 
    ReadInMerge <- read.csv(file=paste(".../tempDataFolder/", FileNames[i], sep=""),
                   header=T, na.strings="NULL")
    dataMerge <- merge(dataMerge, ReadInMerge, by=c("COUNTRYNAME", "COUNTRYCODE", "Year"),
                 all=T)
    }
    

    2 回复  |  直到 15 年前
        1
  •  40
  •   Community CDub    7 年前

    你可能想仔细观察一下 related question on stackoverflow .

    我将通过两个步骤来实现这一点:导入所有数据(使用 plyr

    filenames <- list.files(path=".../tempDataFolder/", full.names=TRUE)
    library(plyr)
    import.list <- llply(filenames, read.csv)
    

    这将为您提供一个现在需要合并在一起的所有文件的列表。有很多方法可以做到这一点,但这里有一种方法(使用 Reduce ):

    data <- Reduce(function(x, y) merge(x, y, all=T, 
        by=c("COUNTRYNAME", "COUNTRYCODE", "Year")), import.list, accumulate=F)
    

    或者,您可以使用 reshape 减少

    library(reshape)
    data <- merge_recurse(import.list)
    
        2
  •  1
  •   Ken Williams Dirk is no longer here    15 年前

    如果我没有弄错的话,一个非常简单的更改可以消除 3:length(FileNames)

    FileNames <- list.files(path=".../tempDataFolder/", full.names=TRUE)
    dataMerge <- data.frame()
    for(f in FileNames){ 
      ReadInMerge <- read.csv(file=f, header=T, na.strings="NULL")
      dataMerge <- merge(dataMerge, ReadInMerge, 
                   by=c("COUNTRYNAME", "COUNTRYCODE", "Year"), all=T)
    }