循环添加列表(R)

时间:2019-03-31 21:30:03

标签: r list loops csv 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

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

我对R很陌生,所以我不确定我缺少什么...

1 个答案:

答案 0 :(得分:0)

您的方法有四个错误。

首先,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"))

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

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]
})

希望有帮助!