我有一堆以相同模式“ dfX.csv”命名的数据帧,其中X表示从1到67的数字。我使用以下代码将它们加载到单独的数据帧中:
folder <- mypath
file_list <- list.files(path=folder, pattern="*.csv")
for (i in 1:length(file_list)){
assign(file_list[i],
read.csv(paste(folder, file_list[i], sep=',', header=TRUE))
)}
我想做的是将它们合并/绑定到一个巨大的数据框中。
for (i in 1:length(file_list)){
df_main <- rbind(df_main, df[[i]].csv)
}
但是使用它却出现错误:
Error: unexpected symbol in:
"for (i in 1:length(file_list)){
df_main <- rbind(df_main, df[[i]].csv"
任何想法都可能导致问题,以及是否有更简单的处理方法。
答案 0 :(得分:0)
在这里,我使用map()
遍历您的文件,将每个文件读入数据帧列表,并且bind_rows
用于将所有df绑定在一起
library(tidyverse)
df <- map(list.files(), read_csv) %>%
bind_rows()
答案 1 :(得分:0)
如果您有很多数据(许多行),那么这是一种data.table
的方法,效果很好:
library(data.table)
basedir <- choose.dir() # directory with all the csv files
file_names <- list.files(path = basedir, pattern= '*.csv', full.names = F, recursive = F)
big_list <- lapply(file_names, function(file_name){
dat <- fread(file = file.path(basedir, file_name), header = T)
# Add a 'filename' column to each data.table to back-track where it was read from
# this is why we set full.names = F in the list.files line above
dat$filename <- gsub('.csv', '', file_name)
return(dat)
})
big_data <- rbindlist(l = big_list, use.names = T, fill = T)
如果您只想读取部分列而不是全部,则可以在select
中使用fread
参数-由于不读取空列,因此有助于提高速度,类似的skip
让您可以跳过一排阅读。
答案 2 :(得分:0)
如果file_list
是文件名的character
向量,此文件名已被加载到本地环境中的变量中,则可能是其中之一
do.call(rbind.data.frame, mget(ls(pattern = "^df\\s+\\.csv")))
do.call(rbind.data.frame, mget(paste0("df", seq_along(file_list), ".csv")))
第一个假定在R的环境中找到的所有内容(如df*.csv
)都适合抓取。然后可能无法以正确的顺序进行抓取,因此请考虑使用sort
或以某种方式自行订购。
mget
接受一个字符串向量,并从给定环境(默认情况下为当前)中检索具有每个名称的对象的值,并返回值列表。
do.call(rbind.data.frame, ...)
对rbind
进行一个调用,这比迭代地rbind
快得多。