【问题标题】:Appending a list in a loop (R)在循环中附加列表(R)
【发布时间】:2019-08-22 01:25:16
【问题描述】:

我想使用循环读取多个 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 文件中获取包含该特定列中所有值的完整附加列表。

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

【问题讨论】:

  • 你得到了什么错误?
  • 看到这个answer
  • 最终列表仅包含最后一个 csv 文件中的列值

标签: r list loops csv append


【解决方案1】:

你的方法有四个错误。

首先,file.names &lt;- 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 &lt;- 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]
})

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2020-03-26
    • 1970-01-01
    • 2021-09-14
    • 2017-05-21
    • 1970-01-01
    • 2013-11-30
    • 2016-05-13
    • 2016-07-14
    • 1970-01-01
    相关资源
    最近更新 更多