如何汇总具有相同字符ID列但具有不同数值的列表

时间:2019-01-22 19:28:57

标签: r purrr

有什么方法可以对包含相同维数的小节并且包含字符ID向量的列表进行数值计算(加法,均值等)?

示例:

require(tidyverse)
#> Loading required package: tidyverse
x <- lst(a = tibble(id = letters, val = 1:26),
         b = tibble(id = letters, val = 27:52))

#This doesn't work of course
x %>% 
  reduce(`+`)
#> Error in FUN(left, right): non-numeric argument to binary operator

#This does, but we lose our identifiers
x %>% 
  map(~select(., -id)) %>% 
  reduce(`+`)
#>    val
#> 1   28
#> 2   30
#> 3   32
#> 4   34
#> 5   36
#> 6   38
#> 7   40
#> 8   42
#> 9   44
#> 10  46
#> 11  48
#> 12  50
#> 13  52
#> 14  54
#> 15  56
#> 16  58
#> 17  60
#> 18  62
#> 19  64
#> 20  66
#> 21  68
#> 22  70
#> 23  72
#> 24  74
#> 25  76
#> 26  78

reprex package(v0.2.1)于2019-01-22创建

更新:

这种工作方式,但仅采用第一个列表项的名称,这似乎容易出错:

y <- lst(a = tibble(id = letters, val = 1:26),
         b = tibble(id = LETTERS, val = 27:52))


y %>% 
  map(~column_to_rownames(., "id")) %>% 
  reduce(`+`) %>% 
  rownames_to_column("id")
#>    id val
#> 1   a  28
#> 2   b  30
#> 3   c  32
#> 4   d  34
#> 5   e  36
#> 6   f  38
#> 7   g  40
#> 8   h  42
#> 9   i  44
#> 10  j  46
#> 11  k  48
#> 12  l  50
#> 13  m  52
#> 14  n  54
#> 15  o  56
#> 16  p  58
#> 17  q  60
#> 18  r  62
#> 19  s  64
#> 20  t  66
#> 21  u  68
#> 22  v  70
#> 23  w  72
#> 24  x  74
#> 25  y  76
#> 26  z  78

reprex package(v0.2.1)于2019-01-22创建

担心不同ID的解决方案是连接,但是接下来我面临如何指定要添加的列的问题,当有两个或更多原始数字列时,这将成为一个更大的问题:

require(tidyverse)
#> Loading required package: tidyverse
z <- lst(a = tibble(id = letters, val = 1:26, otherval = 101:126),
         b = tibble(id = letters, val = 27:52, otherval = 127:152))
z %>% 
  reduce(left_join, by = "id")
#> # A tibble: 26 x 5
#>    id    val.x otherval.x val.y otherval.y
#>    <chr> <int>      <int> <int>      <int>
#>  1 a         1        101    27        127
#>  2 b         2        102    28        128
#>  3 c         3        103    29        129
#>  4 d         4        104    30        130
#>  5 e         5        105    31        131
#>  6 f         6        106    32        132
#>  7 g         7        107    33        133
#>  8 h         8        108    34        134
#>  9 i         9        109    35        135
#> 10 j        10        110    36        136
#> # … with 16 more rows

reprex package(v0.2.1)于2019-01-22创建

1 个答案:

答案 0 :(得分:1)

使用bind_rows()合并数据并根据id对所有观察结果进行分组。

x %>% bind_rows %>%
  group_by(id) %>%
  summarise(val = sum(val))

# A tibble: 26 x 2
   id      val
   <chr> <int>
 1 a        28
 2 b        30
 3 c        32
 4 d        34
 5 e        36
 6 f        38
 7 g        40
 8 h        42
 9 i        44
10 j        46
# ... with 16 more rows