【问题标题】:cbind a list of dataframes in Rcbind R中的数据框列表
【发布时间】:2020-02-01 09:45:41
【问题描述】:

我有 3 个 data.frameslistXYZ)。使用 BASE R,我想知道如何 cbind 在这些 data.frames 中使用类似命名的变量并将它们存储为列表?

对于下面的示例,我希望 3 个 data.frames 中的所有变量 AAs,3 个 data.frames 中的所有变量 BBs,以及 3 个数据中的所有变量 CCs。帧单独cbinded 并存储为列表?

注意:名称可以是任何东西,变量的数量可以是任何数字。高度赞赏函数(al)解决方案。

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)))

【问题讨论】:

  • 总是XYZ 都拥有AABBCC 吗?
  • @RonakShah,让我们将X作为参考data.frame,因此我们可以说所有其他data.frames应该包括@中的名称987654339@
  • 不确定,但也许是这个? lapply(r, function(x) merge(x, r[[1]])) 这假定 x 作为 ref 并合并?
  • @NelsonGon,感谢它,但我认为您的解决方案给出了不同的结果,它不会绑定类似命名的变量。在这里,我们期望 cbinded 变量 AABBCC 的 data.farme。

标签: r list function loops dataframe


【解决方案1】:

使用purrrdplyr 的方法是tranpose 列表,然后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
#....
#....

在base 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))

【讨论】:

    【解决方案2】:

    base R 中,我们可以将cbindlist 元素合并为一个单独的元素,然后执行split

    m1 <- do.call(cbind, r)
    split.default(m1, sub("^.*\\.", "", names(m1)))
    

    【讨论】:

      猜你喜欢
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 2015-12-28
      • 2012-01-18
      • 1970-01-01
      相关资源
      最近更新 更多