我有一个dataframe列,其中一列是包含每行矩阵的列表,定义了该观察的转换矩阵.
library(tidyverse)
m <- matrix(1:4, ncol = 2)
d <- data_frame(g = c('a', 'a', 'b', 'b', 'b', 'c'),
m = rep(list(m), 6))
Run Code Online (Sandbox Code Playgroud)
这看起来像:
# A tibble: 6 × 2
g m
<chr> <list>
1 a <int [2 × 2]>
2 a <int [2 × 2]>
3 b <int [2 × 2]>
4 b <int [2 × 2]>
5 b <int [2 × 2]>
6 c <int [2 × 2]>
Run Code Online (Sandbox Code Playgroud)
我想摆脱两个矩阵的列表,a并且b是所有矩阵的每个相应分组的因素的总和.我需要这种方法推广到任意数量的组,因为我不会提前知道分组因子的数量.
我曾尝试by_slice和do,但我可以管理到输出为全矩阵的总和,或者该总和a或b基质单独-不是在一个组的约束.
您可以通过将矩阵嵌套在组(使用tidyr nest)中来创建,这将创建一个包含矩阵列表的列表列.然后,您可以使用purrr map并reduce总结每个组列表中的矩阵:
results <- d %>%
nest(-g) %>%
mutate(summed = map(data, ~ reduce(.$m, `+`)))
Run Code Online (Sandbox Code Playgroud)
结果:
# A tibble: 3 × 3
g data summed
<chr> <list> <list>
1 a <tibble [2 × 1]> <int [2 × 2]>
2 b <tibble [3 × 1]> <int [2 × 2]>
3 c <tibble [1 × 1]> <int [2 × 2]>
Run Code Online (Sandbox Code Playgroud)
该summed列将在每个组中添加矩阵.
如果你想把它变成一个带有a/b/c矩阵项的命名列表,你可以这样做:
lst <- results$summed
names(lst) <- results$g
lst
Run Code Online (Sandbox Code Playgroud)
或者:
results %>%
select(-data) %>%
spread(g, summed)
Run Code Online (Sandbox Code Playgroud)