通过分组因子对data.frame中的矩阵列表列求和

我有一个数据框,其中一列是一个包含每行矩阵的列表,定义了该观察的转换矩阵.

library(tidyverse)
m <- matrix(1:4, ncol = 2)
d <- data_frame(g = c('a', 'a', 'b', 'b', 'b', 'c'),
                m = rep(list(m), 6))

这看起来像:

# 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]>

我想得出两个矩阵的列表,a和b,它们是每个相应分组因子的所有矩阵的总和.我需要这种方法推广到任意数量的组,因为我不会提前知道分组因子的数量.

我已经尝试了by_slice并且做了,但我能设法输出的是所有矩阵的总和,或者仅仅a或b矩阵的总和 – 不绑定在单个组中.

最佳答案
您可以通过将矩阵嵌套在组(使用tidyr的嵌套)中来创建,这将创建一个包含矩阵列表的列表列.然后,您可以使用purrr的map和reduce来汇总每个组列表中的矩阵:

results <- d %>%
  nest(-g) %>%
  mutate(summed = map(data, ~ reduce(.$m, `+`)))

结果:

# 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]>

求和列将在每个组中添加矩阵.

如果你想把它变成一个带有a / b / c矩阵项的命名列表,你可以这样做:

lst <- results$summed
names(lst) <- results$g
lst

或者:

results %>%
  select(-data) %>%
  spread(g, summed)

转载注明原文:通过分组因子对data.frame中的矩阵列表列求和 - 代码日志