在R中将数据框列表合并为一个数据框(使用cbind)

4
我有一个包含三个数据框(X,Y,Z)的列表。使用基本的R语言,我想知道如何将这些数据框中同名的变量进行cbind,并将它们存储为一个列表?
例如,在下面的示例中,我想将所有3个数据框中的AA变量、所有BB变量和所有CC变量分别进行cbind并存储为一个列表?
注意:变量名称可以是任何内容,变量的数量也可以是任何数量。非常感谢提供函数解决方案。
r <- list( 

X = data.frame(

     AA = c(1,1,1,1,3,2), 
     BB = c(1,1,1,2,2,2), 
     CC = c(2,2,3,1,2,1)), 

Y = data.frame(

     AA = c(1,1,1,1,3,2), 
     BB = c(1,1,1,2,2,2), 
     CC = c(2,2,3,1,2,1)),

Z = data.frame(

     AA = c(1,1,1,1,3,2), 
     BB = c(1,1,1,2,2,2), 
     CC = c(2,2,3,1,2,1)))

1
每个 XYZ 是否总是都有 AABBCC - Ronak Shah
@RonakShah,我们将X作为参考数据框,因此我们可以说所有其他数据框应包括X中的名称,以及其他名称。 - rnorouzian
不确定,但也许是这样的吗?lapply(r, function(x) merge(x, r[[1]])) 这假设 x 为参考并合并? - NelsonGon
1
@NelsonGon,感谢您的帮助,但我认为您的解决方案给出了不同的结果,它没有将同名变量进行列合并。在这里,我们期望得到一个数据框,其中包含列合并后的变量AABBCC - rnorouzian
2个回答

2
基本R中,我们可以将列表(list)中的元素cbind到一个单独的元素上,然后进行split操作。
m1 <- do.call(cbind, r)
split.default(m1, sub("^.*\\.", "", names(m1)))

2
一种使用purrrdplyr的方法是将列表进行transpose,然后使用bind_cols组合在一起。
library(dplyr)
library(purrr)

transpose(r) %>% map(bind_cols)

#$AA
# A tibble: 6 x 3
#      X     Y     Z
#  <dbl> <dbl> <dbl>
#1     1     1     1
#2     1     1     1
#3     1     1     1
#4     1     1     1
#5     3     3     3
#6     2     2     2

#$BB
# A tibble: 6 x 3
#      X     Y     Z
#    <dbl> <dbl> <dbl>
#1     1     1     1
#2     1     1     1
#3     1     1     1
#4     2     2     2
#....
#....

在基础R中,以列表中的第一个数据框作为参考数据框,我们可以进行以下操作:
all_cols <- names(r[[1]])
#To get common names between all dataframes.
#all_cols <- Reduce(intersect, lapply(r, names)) 
lapply(all_cols, function(x) sapply(r, `[[`, x))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接