如何绑定多个命名数据框但只保留公共列?

How to rbind several named dataframes but keep only common columns?

我在命名空间中有几个名为 a32、a33、...、a63 的数据框,我必须将它们绑定到一个数据框。每个都有几个(大约 20 个)列。他们应该有共同的列名,但不幸的是,有一些缺少一些列。当我尝试绑定它们时,这会导致错误。

l <- 32:63
l<- as.character(l)       ## create a list of characters

A <- do.call(rbind.data.frame,mget(paste0("a",l))) ## "colnames not matching" error

Error in (function (..., deparse.level = 1, make.row.names = TRUE, stringsAsFactors = default.stringsAsFactors(),  : 
  numbers of columns of arguments do not match

我想通过只获取公共列来绑定它们。我尝试在 for 循环中使用 paste0 来列出所有数据框的列名,并查看哪些数据框缺少列但无处可去。如何通过逐个列出每个数据框的列名来避免手动搜索缺失的列。

举个小例子,说:

a32 <- data.frame(AB = 1, CD = 2, EF = 3, GH = 4)
a33 <- data.frame(AB = 6,         EF = 7)
a34 <- data.frame(AB = 8, CD = 9, EF = 10, GH = 11)
a35 <- data.frame(AB = 12,CD = 13,        GH = 14)
a36 <- data.frame(AB = 15,CD = 16,EF = 17,GH = 18)
and so on

有没有一种有效的方法来绑定命名空间中的所有 32 个数据帧?

  • 获取列表中的数据帧。
  • 使用 Reduce + intersect
  • 找出共同的列
  • 从具有公共列的列表中子集每个数据帧
  • 将所有数据合并在一起。
list_data <- mget(paste0("a",l))
common_cols <- Reduce(intersect, lapply(list_data, colnames))
result <- do.call(rbind, lapply(list_data, `[`, common_cols))

您也可以使用 purrr::map_df 来缩短这段时间。

result <- purrr::map_df(list_data, `[`, common_cols)

基础 R 解决方案:

# get names from workspace
dat_names <- ls()[grepl("a[0-9][0-9]", ls())]

# get data
df <- lapply(dat_names, get)

# get comman col
commen_col <- Reduce(intersect, sapply(df, FUN = colnames, simplify = TRUE))

# selet and ribind
dat <- lapply(df, FUN = function(x, commen_col) x[, c(commen_col)], commen_col=commen_col)
dat <- do.call("rbind", dat)
colnames(dat) <- commen_col
dat

# AB
# [1,]  1
# [2,]  6
# [3,]  8
# [4,] 12
# [5,] 15