r - tidyverse:有效绑定(bind)列表元素

标签 r dplyr tidyverse bind

我想从列表中绑定(bind)相同行数的 data.frame,如下所示。

df1 <- data.frame(A1 = 1:10, B1 = 11:20)
df2 <- data.frame(A1 = 1:10, C1 = 21:30)
df3 <- data.frame(A2 = 1:15, B2 = 11:25, C2 = 31:45)
df4 <- data.frame(A2 = 1:15, D2 = 11:25, E2 = 51:65)
df5 <- 5

ls <- list(df1, df2, df3, df4, df5)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
bind_cols(ls[1], ls[2], .id = NULL)
#> New names:
#> * A1 -> A1...1
#> * A1 -> A1...3
#>    A1...1 B1 A1...3 C1
#> 1       1 11      1 21
#> 2       2 12      2 22
#> 3       3 13      3 23
#> 4       4 14      4 24
#> 5       5 15      5 25
#> 6       6 16      6 26
#> 7       7 17      7 27
#> 8       8 18      8 28
#> 9       9 19      9 29
#> 10     10 20     10 30
bind_cols(ls[3], ls[4], .id = NULL)
#> New names:
#> * A2 -> A2...1
#> * A2 -> A2...4
#>    A2...1 B2 C2 A2...4 D2 E2
#> 1       1 11 31      1 11 51
#> 2       2 12 32      2 12 52
#> 3       3 13 33      3 13 53
#> 4       4 14 34      4 14 54
#> 5       5 15 35      5 15 55
#> 6       6 16 36      6 16 56
#> 7       7 17 37      7 17 57
#> 8       8 18 38      8 18 58
#> 9       9 19 39      9 19 59
#> 10     10 20 40     10 20 60
#> 11     11 21 41     11 21 61
#> 12     12 22 42     12 22 62
#> 13     13 23 43     13 23 63
#> 14     14 24 44     14 24 64
#> 15     15 25 45     15 25 65

在我的实际列表中,我有大约二十个不同行数的数据帧。我想知道是否有一种更有效的方法来绑定(bind)相同行数的 data.frames,而无需给出列表元素的名称和索引。

最佳答案

通过分割更容易做到这一点。使用 gl

创建分组索引
grp <- as.integer(gl(length(ls), 2, length(ls)))

然后使用split

library(dplyr)
library(purrr)
library(stringr)
split(ls, grp) %>% # // split by the grouping index 
     map(bind_cols) %>% # // loop over the `list` and use `bind_cols`
     set_names(str_c('df', seq_along(.))) %>% # // name the `list`
     list2env(.GlobalEnv) # // create objects in global env

-输出

head(df1)
#  A1...1 B1 A1...3 C1
#1      1 11      1 21
#2      2 12      2 22
#3      3 13      3 23
#4      4 14      4 24
#5      5 15      5 25
#6      6 16      6 26

head(df2)
#  A2...1 B2 C2 A2...4 D2 E2
#1      1 11 31      1 11 51
#2      2 12 32      2 12 52
#3      3 13 33      3 13 53
#4      4 14 34      4 14 54
#5      5 15 35      5 15 55
#6      6 16 36      6 16 56

head(df3)
# A tibble: 1 x 1
#   ...1
#  <dbl>
#1     5

注意:

  1. 最好将元素保留在 list 中,而不是在全局环境中创建对象,即 list2env
  2. ls 是一个函数名称,用函数名称命名对象不是一个好的选择,因为它可能会导致错误情况

关于r - tidyverse:有效绑定(bind)列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63872575/

相关文章:

r - R中斜率系数的推论

r - 从 R 数据框中的所有值中减去特定行的列特定值

r - 将分隔的字符串拆分为多列并将它们分成行

r - 在多个变量上应用命令时缩短 case_when 语法

r - 加载 dyplyr 和 tidyverse 时 namespaceExport(ns,exports) 出错

r - 在 y 轴上方添加空间而不用 expand()

r - 突出显示图中的最高残差 : R

r - 根据条件和列名称改变乘法列

r - 计算字符串中子字符串的出现次数

r - 访问 R 中 kernlab::gausspr 函数中的估计变量