r - 单独 tibble 列表列中的矩阵求和

标签 r dplyr purrr tibble

我有一个带有两个列表列的 tibble 数据框。在列表列 mat_base 中,每行包含一个 2x2 矩阵。在列表列 mat_sim 中,每行包含 10 个 2x2 矩阵的列表。我想创建一个新的列表列 mat_out,它是 mat_base 矩阵和每个 mat_sim 矩阵(在给定的范围内)的总和排)。 IE。 mat_out 的每一行应包含 10 个矩阵的列表。

我认为有一种方法可以使用 lapply 或 purrr 库来做到这一点,但我一直无法弄清楚。任何帮助表示赞赏。

library(tibble)    
library(dplyr)
library(purrr)

mat_base <- list(diag(2) * 1, diag(2) * 2, diag(2) * 3)

mat_sim_a <- replicate(10, matrix(rnorm(4), nrow = 2), simplify = F)
mat_sim_b <- replicate(10, matrix(rnorm(4), nrow = 2), simplify = F)
mat_sim_c <- replicate(10, matrix(rnorm(4), nrow = 2), simplify = F)

dat <- tibble(group = c('a', 'b', 'c')) %>% 
  mutate(mat_base = mat_base,
         mat_sim = list(mat_sim_a, mat_sim_b, mat_sim_c))

# doesn't work
dat %>% 
  mutate(mat_out = lapply(.$mat_sim, function(x, y) x + y, y = .$mat_base))

# doesn't work
dat %>% 
  mutate(mat_out = purrr::map(.$mat_sim, function(x, y) x + y, y = .$mat_base))

最佳答案

我们可以使用嵌套的map2来获取“mat_base”和“mat_sim”的+,以将“mat_out”创建为列

dat %>% 
    mutate(mat_out = map2(mat_base, mat_sim, ~ 
                                    map2(list(.), .y, `+`)))
# A tibble: 3 x 4
#   group mat_base      mat_sim     mat_out    
#  <chr> <list>        <list>      <list>     
#1 a     <dbl [2 x 2]> <list [10]> <list [10]>
#2 b     <dbl [2 x 2]> <list [10]> <list [10]>
#3 c     <dbl [2 x 2]> <list [10]> <list [10]>

关于r - 单独 tibble 列表列中的矩阵求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48842873/

相关文章:

r - 合并r中具有相同行名的2个数据帧

r - 加速 R for 循环以将多个变量粘贴在一起

r - 使用 dplyr 创建一个字符变量,其值以先前变量(它们的名称和值)为条件

r - 如果 df 不为空,则 dplyr 负选择

r - Dplyr:在不均匀因子水平内减去

r - 在 data.frame 上使用 invoke_map() 或 exec()

r - dplyr 按年汇总,包括年数

r - 将 1x1 数据帧转换为值

r - 使用 purrr 映射将函数应用于 dplyr 管道中 DataFrame 中列的选择

r - 使用 purrr 和 ggplot 创建残差图矩阵