首页 文章

单独的tibble列列中的矩阵求和

提问于
浏览
2

我有一个包含两个列表列的tibble数据框 . 在列表列 mat_base 中,每行包含一个2x2矩阵 . 在列表列 mat_sim 中,每行包含10个2x2矩阵的列表 . 我想创建一个新的列表列 mat_out ,它是 mat_base 矩阵和每个 mat_sim 矩阵(在给定行内)的总和 . 即 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))

2 回答

  • 1

    您可以通过在位置而不是实际列表上使用 lapply 来解决问题,从而可以访问嵌套级别:

    dat %>% 
      mutate(mat_out = lapply(1:3, function(x) 
        lapply(dat$mat_sim[[x]],function(y) y+dat$mat_base[[x]])))
    
  • 2

    我们可以使用嵌套的 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]>
    

相关问题