在循环中添加一个列表 (R)

15 浏览
0 Comments

在循环中添加一个列表 (R)

我想要使用循环来读取多个csv文件,并在R中追加一个列表。

路径 =“〜/路径/到/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文件的特定列的所有值的完整追加列表。

0
0 Comments

Appending a list in a loop (R)这个问题的出现原因是在代码的几个地方出现了错误。首先,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选项。

0