有什么方法可以对包含相同维数的小节并且包含字符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创建
答案 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