循环绑定多个数据帧

时间:2019-08-29 18:21:01

标签: r dataframe

我有一堆以相同模式“ 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"

任何想法都可能导致问题,以及是否有更简单的处理方法。

3 个答案:

答案 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快得多。