合并文件夹中具有不同列名的多个数据框

时间:2020-08-31 05:37:42

标签: r

我有许多大型数据帧,每行具有唯一的ID,并且每个数据帧可以具有不同的列名集(有些相同,有些则不同)。我想将所有数据框整理为一个数据框。我目前正在使用smartbind中的gtools函数将小的数据帧绑定在一起,例如下面示例中的数据帧(输出是我所需要的)。

df1 <- data.frame("ID" = c(1,2,3))
df1$A <- c(1, 2, 3)
df1$B <- c("a", "d", "g")
df1


df2 <- data.frame("ID" = c(7,9,10))
df2$A <- c(5, 6, 7)
df2$C <- c("f", "bv", "gn")
df2


df3 <- data.frame("ID" = c(11,12,13))
df3$A <- c("g", "h", 7)
df3$B <- c("f", "bv", "gn")
df3$D <- c(1, 5, 7)
df3

gtools::smartbind(df1,df2,df3)

    ID A    B    C  D
1:1  1 1    a <NA> NA
1:2  2 2    d <NA> NA
1:3  3 3    g <NA> NA
2:1  7 5 <NA>    f NA
2:2  9 6 <NA>   bv NA
2:3 10 7 <NA>   gn NA
3:1 11 g    f <NA>  1
3:2 12 h   bv <NA>  5
3:3 13 7   gn <NA>  7

尽管这是一个很好的解决方案,但这是手动过程(而且我已经读过smartbind是否不适用于大型数据帧?)。我希望理想地具有允许我将多个.csv文件绑定到一个文件夹中的代码。我目前有将一个文件夹中的多个.csv文件联接在一起的代码(如下),但这是联接多个数据框的解决方案,而不是绑定具有不同列名集的多个大型数据框的解决方案。

以下是我用于合并文件夹中多个文件的代码:

data_all <- list.files(path = "C:/Users/Documents/path/",     
                       pattern = "*.csv", full.names = TRUE) %>% 
            lapply(readr::read_csv) 

merged_files <- data_all %>% purrr::reduce(full_join, by = "ID") 

1 个答案:

答案 0 :(得分:1)

您可以使用do.call使用smartbind组合数据帧列表。

do.call(gtools::smartbind, data_all)

smartbind不需要相同类型的列类,它隐式更改了该类。


如果显式转换类,则也可以使用tidyverse函数来完成。

library(dplyr)
library(purrr)

map_df(data_all, ~.x %>% mutate(across(-1, as.character)))

#  ID A    B    C    D
#1  1 1    a <NA> <NA>
#2  2 2    d <NA> <NA>
#3  3 3    g <NA> <NA>
#4  7 5 <NA>    f <NA>
#5  9 6 <NA>   bv <NA>
#6 10 7 <NA>   gn <NA>
#7 11 g    f <NA>    1
#8 12 h   bv <NA>    5
#9 13 7   gn <NA>    7