FCo*_*cil 2 csv loops r list 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
Run Code Online (Sandbox Code Playgroud)
对于每个 csv 文件,所需的列具有不同的长度。最后,我想从所有 csv 文件中获取包含该特定列中所有值的完整附加列表。
我对R相当陌生,所以我不确定我错过了什么......
你的方法有四个错误。
首先,file.names <- dir(path, pattern =".csv")将只提取文件名,不提取路径。所以,当你尝试导入时,read.csv()没有找到。
构建路径
您可以构建正确的路径,包括paste0():
path = "~/path/to/csv/"
file.names <- paste0(path, dir(path, pattern =".csv"))
Run Code Online (Sandbox Code Playgroud)
或者file.path(),它会自动添加斜杠。
path = "~/path/to/csv"
file.names <- file.path(path, dir(path, pattern =".csv"))
Run Code Online (Sandbox Code Playgroud)
对我来说,另一种创建路径的方法更有效,这是 Tung 评论的答案中建议的。
file.names <- list.files(path = "~/path/to/csv", recursive = TRUE,
pattern = "\\.csv$", full.names = TRUE)
Run Code Online (Sandbox Code Playgroud)
这更好,因为除了一步完成之外,您还可以在包含多种格式的多个文件的目录中使用。上面的代码将匹配文件夹中的所有 .csv 文件。
导入、选择和创建列表
第二个错误在mylist <- c(). 你想要一个列表,但这会创建一个向量。所以,正确的是:
mylist <- list()
Run Code Online (Sandbox Code Playgroud)
最后一个错误在循环内。在追加时不要创建其他列表,而是使用循环之前创建的相同对象:
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
Run Code Online (Sandbox Code Playgroud)
另一种更简单、更简洁的方法是使用lapply(). 只是这个:
mylist <- lapply(file.names, function(x) {
df <- read.csv(x, sep = ";", stringsAsFactors = FALSE)
df[, 6]
})
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你!