将df.1,df.2,df.3 ... df.x合并为一个数据帧

时间:2014-04-07 01:56:53

标签: r dataframe merge rbind read.csv

我正在开发一个项目,该项目从给定文件夹导入所有csv文件并将它们合并到一个文件中。我能够从文件夹中的每个文件导入我想要的行和列,但现在需要帮助将它们全部合并到一个文件中。我不知道最终会有多少文件(可能大约120个)所以我不想将它们合并为1。

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

 # Import All files
 rowsToUse <- c(9:104,657:752)
 colsToUse <- c(15,27,28,29,30,33,35)
 filenames <- list.files("save", pattern="*.csv", full.names=TRUE)
 for (i in seq_along(filenames)) {
   assign(paste("df", i, sep = "."), read.csv(filenames[i])[!is.na(30),][rowsToUse,colsToUse])
 }

 # Merge into one file
 for (i in seq_along(filenames)) {
   df<-rbind(df.[i])
 }

代码的第一部分创建了一系列标记为df.1,df.2等的数据帧。我希望它们最终出现在一个名为df的最终数据帧中。所有文件的结构都相同。

如果有人多花几分钟,我真的很感激一些帮助!谢谢!

2 个答案:

答案 0 :(得分:4)

那些看起来很复杂;)。上面的答案似乎在运行“我们有一个名称非常相似的对象列表,我们如何处理”。答:他们不需要有非常相似的名字。它们甚至不必是不同的物体。

如果您不是通过for循环读取文件,而是通过lapply()读取文件,则会得到一个包含所有数据框的对象 - 每个数据框作为单个元素。然后可以简单地提取这些。所以你有一些看起来像......

#Grab a list of filenames
filenames <- list.files("save", pattern="*.csv", full.names=TRUE)

#Iterate through that list of names, using lapply(), reading the data in.
list_of_data_frames <- lapply(filenames, function(x){

    #Read the data in
    to_return <- read.csv(x)[!is.na(30),][c(9:104,657:752),c(15,27,28,29,30,33,35)])

    #Return it. You could save lines of code (and processor time!) by just reading
    #straight into return(), but it would be a lot less clear.
    return(to_return)
})

#Now use do.call to turn it into a single data frame.
data.df <- do.call("rbind", list_of_data_frames)

答案 1 :(得分:3)

由于您已经阅读了文件,因此可以尝试以下方法:

do.call(rbind, mget(ls(pattern = "df")))

ls(pattern = df)应该捕获所有“df.1”,“df.2”,依此类推。希望您没有使用相同模式命名的其他内容,但如果您这样做,请尝试更严格的模式,直到该命令仅列出您的data.frame

mget()会将所有这些内容纳入list,您可以使用do.call(rbind, ...)