单独的 tibble 列表列中的矩阵求和
Summation of matrices in separate tibble list columns
我有一个包含两个列表列的 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))
您可以通过在位置上使用 lapply
而不是实际列表来解决问题,这样您就可以访问嵌套级别:
dat %>%
mutate(mat_out = lapply(1:3, function(x)
lapply(dat$mat_sim[[x]],function(y) y+dat$mat_base[[x]])))
我们可以使用嵌套的 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]>
我有一个包含两个列表列的 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))
您可以通过在位置上使用 lapply
而不是实际列表来解决问题,这样您就可以访问嵌套级别:
dat %>%
mutate(mat_out = lapply(1:3, function(x)
lapply(dat$mat_sim[[x]],function(y) y+dat$mat_base[[x]])))
我们可以使用嵌套的 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]>