在循环中附加列表 (R)

FCo*_*cil 2 csv loops r list append

我想使用循环读取多个 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
Run Code Online (Sandbox Code Playgroud)

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

我对R相当陌生,所以我不确定我错过了什么......

Bru*_*iro 5

你的方法有四个错误。

首先,file.names <- dir(path, pattern =".csv")将只提取文件名,不提取路径。所以,当你尝试导入时,read.csv()没有找到。

构建路径

您可以构建正确的路径,包括paste0()

path = "~/path/to/csv/"
file.names <- paste0(path, dir(path, pattern =".csv"))
Run Code Online (Sandbox Code Playgroud)

或者file.path(),它会自动添加斜杠。

path = "~/path/to/csv"
file.names <- file.path(path, dir(path, pattern =".csv"))
Run Code Online (Sandbox Code Playgroud)

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

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

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

导入、选择和创建列表

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

mylist <- list()
Run Code Online (Sandbox Code Playgroud)

最后一个错误在循环内。在追加时不要创建其他列表,而是使用循环之前创建的相同对象:

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
Run Code Online (Sandbox Code Playgroud)

另一种更简单、更简洁的方法是使用lapply(). 只是这个:

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

希望能帮助到你!