1

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

这是我到目前为止所拥有的:

 # 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 的最终数据帧中。所有文件的结构都相同。

如果有人有几分钟的额外时间,我将非常感谢一些帮助!谢谢!

4

2 回答 2

5

由于您已经阅读了其中的文件,因此您可以尝试以下操作:

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

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

mget()会将所有这些都带入list您可以使用do.call(rbind, ...)的 .

于 2014-04-07T02:12:49.397 回答
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)
于 2014-04-07T02:15:19.720 回答