我有许多大型数据帧,每行具有唯一的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")
答案 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