在循环中添加一个列表 (R)
在循环中添加一个列表 (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文件的特定列的所有值的完整追加列表。
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
选项。