我想使用循环读取多个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很陌生,所以我不确定我缺少什么...
答案 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]
})
希望有帮助!