我想在一个数据框中导入和绑定一组.csv文件。 我创建了一个文件列表,然后是一个for循环来读取每个文件并将它们绑定在一起。但是,在第二个文件中,我收到一条错误消息,指出缺少此类文件或目录。但它确实存在于我创建的文件列表中。有关这个问题的任何建议吗?谢谢。
file.names <- list.files(path = pathname, pattern = " trial.csv")
for(i in seq(file.names)){
file1 <- read.csv(file.names[i], header = TRUE, stringsAsFactors = FALSE)
file1 <- t(file)
file1 <- data.frame(file, stringsAsFactors = FALSE)
colnames(file1) = file1[1,]
print(file1)
}
答案 0 :(得分:1)
默认情况下,list.files()
返回没有目录详细信息的文件名。导入文件时,通常需要设置full.names = TRUE
以返回绝对路径(包括目录名称)。
良好的代码模式如下。
library(assertive.files)
files_to_import <- list.files(some_path, full.names = TRUE)
assert_all_are_existing_files(files_to_import)
data <- lapply(files_to_import, read.csv)
答案 1 :(得分:0)
我想导入并在一个数据框中绑定一组.csv文件。
@ richie-cotton提供了修复路径问题的答案,但我想解决问题中突出显示的部分。
Richie Cotton的代码:
library(assertive.files)
files_to_import <- list.files(some_path, full.names = TRUE)
assert_all_are_existing_files(files_to_import)
data <- lapply(files_to_import, read.csv)
将以data
结尾,即data.frames列表。您希望这些是data.frame
。看一下类似问题的答案:https://stackoverflow.com/a/18489830/5333994
我的建议是在结果rbindlist
列表中使用data.frame
结束。
library(data.table)
data <- rbindlist(data)
事实上,如果您要使用data.table
,可以将read.csv
替换为fread
,这可能会加快速度。
library(data.table)
library(assertive.files)
files_to_import <- list.files(some_path, full.names = TRUE)
assert_all_are_existing_files(files_to_import)
data <- rbindlist(lapply(files_to_import, fread))
如果您希望以data.frame
而不是data.table
结束,只需使用setDF
。
setDF(data)
如果您想完全避免data.table
,那么运行do.call
可能是您的最佳选择。
data <- do.call("rbind", data)
请注意我上面提到的答案,这可能比使用rbindlist
的操作要慢得多,具体取决于您拥有的文件数量。