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

标签 r dplyr tidyverse

我有一个 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))

这看起来像:

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

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

我尝试过 by_slicedo,但我只能输出所有矩阵的总和,或者 a 的总和code> 或 b 单独的矩阵 - 不绑定(bind)在一个组中。

最佳答案

您可以通过将矩阵嵌套在组中来实现这一点(使用 tidyr 的 nest),这会创建一个包含矩阵列表的列表列。然后,您可以使用 purrr 的 mapreduce 来总结每个组列表中的矩阵:

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

summed 列将每个组内的矩阵相加。


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

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

或者:

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

关于r - 通过分组因子对 data.frame 中的矩阵列表列求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42811324/

相关文章:

替换丢失顺序的 data.frame 中的值

R 数据框组织

r - 聚类后​​将类分配给数据框

r - R中dygraphs包(使用JavaScript)中dygraph中的日期错误

R lag/lead - 如何忽略现有行之前和之后的行

r - 结合基于多个条件的观察

r - 在r中使用atop函数时获得恒定的文本大小

r - corAR1 上 gls 的 r 错误 - 不是唯一的

R - 比较 R 中 2 个数据帧之间的数据

r - 如何对 block 中的变量进行排序