我正在开发一个项目,该项目从给定文件夹导入所有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的最终数据帧中。所有文件的结构都相同。
如果有人多花几分钟,我真的很感激一些帮助!谢谢!
答案 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, ...)
。