【问题标题】:R sum a twice nested list using purrrR使用purrr对两次嵌套列表求和
【发布时间】:2019-06-25 20:39:04
【问题描述】:

我有一个具有以下维度的 data.frame: 输出: as_tibble(data2)

lamda meanlog sdlog freq      freqsev   
<dbl>   <dbl> <dbl> <list>    <list>    
1     5       9   2   <int [4]> <list [4]>
2     2      10   2.1 <int [4]> <list [4]>
3     3      11   2.2 <int [4]> <list [4]>

其中freqsev 是长度为freq 的值的列表,freq 本身是长度为s 的值的列表,其中s 是模拟次数。

library(tidyverse)
set.seed(123)
s <- 5
data <- data.frame(lamda = c(5, 2, 3), meanlog = c(9, 10, 11), sdlog = c(2, 2.1, 2.2))

data2 <- data %>% mutate(
  freq = map(lamda, ~rpois(s, .x)),
  freqsev = map(freq, ~map(.x, function(k) rlnorm(k, meanlog, sdlog)))
  )

我想对freqsev 求和(产生&lt;dbl [4]&gt;,其中[4] 是s 的索引),即freq 出现次数的总和,例如

对于data2$freqsev[[1]][[1]],我希望得到总和。

如何做到这一点?谢谢。

【问题讨论】:

标签: r dplyr sum purrr


【解决方案1】:

说实话,这是一种非常复杂的数据存储方式,在创建 freq 列之后使用 unnest() 可能会更好。但是,您可以像这样得到 freqsev 向量的总和:

data2 <- data %>% mutate(
  freq = map(lamda, ~rpois(s, .x)),
  freqsev = map(freq, ~map(.x, function(k) rlnorm(k, meanlog, sdlog))),
  freqsum = map(freqsev, ~map_dbl(.x, ~sum(.x)))
)

因为freqsev是一个双嵌套列表,所以还需要双映射求和操作。

【讨论】:

  • 感谢@(A. Stam),它按预期求和,但是它返回另一个长度为 1 的向量的 - 我怎样才能摆脱这个并返回一个 ?我会研究 unnest() 函数
  • purrr 中有一个很好的方法可以做到这一点,使用map_dbl 而不是map(或map_chr 等)。我编辑了我的答案以使用 map_dbl 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多