在循环中追加列表

4
我想使用循环读取多个csv文件并在R中将列表附加到一起。
path = "~/path/to/csv/"
file.names <- dir(path, pattern =".csv")
mylist=c()

for(i in 1:length(file.names)){
 
  datatmp <- read.csv(file.names[i],header=TRUE, sep=";", stringsAsFactors=FALSE)
  listtmp = datatmp[ ,6]
  finallist <- append(mylist, listtmp)
}
finallist

对于每个csv文件,所需列的长度不同。 最终,我想要获取所有csv文件中特定列中的所有值的完整附加列表。

你得到了什么错误? - Oka
请查看此答案 - Tung
最终列表仅包含来自最后一个CSV文件的列值。 - FCouncil
1个回答

9

你的方法存在四个错误。

首先,file.names <- dir(path, pattern =".csv") 只会提取文件名,没有路径。因此,当您尝试导入它们时,read.csv() 找不到文件。

构建路径

您可以使用 paste0() 构建正确的路径:

path = "~/path/to/csv/"
file.names <- paste0(path, dir(path, pattern =".csv"))

或者使用 file.path(),它会自动添加斜杆。
path = "~/path/to/csv"
file.names <- file.path(path, dir(path, pattern =".csv"))

另一种创建路径的方法,对我来说更有效率,就是由Tung评论的答案所建议的方法。

file.names <- list.files(path = "~/path/to/csv", recursive = TRUE,
                            pattern = "\\.csv$", full.names = TRUE)

这样做更好,因为除了一步完成所有操作外,您还可以在包含各种格式文件的目录中使用它。上面的代码将匹配文件夹中的所有 .csv 文件。

导入、选择和创建列表

第二个错误在于 mylist <- c()。您想要一个列表,但这样会创建一个向量。所以正确的方式是:

mylist <- list()

最后一个错误出现在循环内部。在添加元素时,不要创建新列表,而是使用在循环之前创建的同一对象:

for(i in 1:length(file.names)){
  datatmp <- read.csv(file.names[i], sep=";", stringsAsFactors=FALSE)
  listtmp = datatmp[, 6]
  mylist <- append(mylist, list(listtmp))
}
mylist

另一种更简单、更清晰的方法是使用 lapply() 进行循环。只需要这样:

mylist <- lapply(file.names, function(x) {
  df <- read.csv(x, sep = ";", stringsAsFactors = FALSE)
  df[, 6]
})

希望能对您有所帮助!

另外,也可以在dir函数中使用full.names = T选项。 - daneshjai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接