取得关于data.frame子集的purrr的总和/平均值

时间:2019-01-31 20:56:58

标签: r dplyr sum purrr

我想在以下情况中找到所有事件的总和,然后找出这些总和的平均值:

library(tidyverse)

set.seed(123)

s <- 2

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的总和,然后取模拟范围内freqsev的总和的平均值: 关于如何实现的任何想法?谢谢!

data3 <- data2 %>% 
  mutate(sum-freqsev = ???
         mean-sum-freqsev = ???)

期望的尺寸:

data2是具有3行的data.frame(例如,每个lamda

sum-freqsev应该是<int [2]>的列表,即freqsev中条目的总和。 mean-sum-freqsev应该是一个数字,只是每个sum-freqsev的平均值lamda

1 个答案:

答案 0 :(得分:1)

我们可以使用嵌套的map查找sum_freqsev,使用单个map查找mean_sum_freqsev

library(tidyverse)

data3 <- data2 %>% 
  mutate(sum_freqsev = freqsev %>% map(~map_dbl(., sum)),
         mean_sum_freqsev = sum_freqsev %>% map_dbl(mean),
         percentile = freqsev %>% map(~map(., ~quantile(.x, c(.50, .90)))))

内部map_dbl对每个模拟中freqsev的条目求和,并返回double类型的向量,而不是包含两个元素的列表。

mean_sum_freqsev是通过获取mean的每个列表元素(向量)的sum_freqsev并返回双精度值来计算的。

输出:

> as.tibble(data3)
# A tibble: 3 x 8
  lamda meanlog sdlog freq      freqsev    sum_freqsev mean_sum_freqsev percentile
  <dbl>   <dbl> <dbl> <list>    <list>     <list>                 <dbl> <list>    
1     5       9   2   <int [2]> <list [2]> <dbl [2]>           1493880. <list [2]>
2     2      10   2.1 <int [2]> <list [2]> <dbl [2]>            623586. <list [2]>
3     3      11   2.2 <int [2]> <list [2]> <dbl [2]>             15219. <list [2]>

> data3 %>% pull(percentile)
[[1]]
[[1]][[1]]
      50%       90% 
  24633.8 1832533.5 

[[1]][[2]]
      50%       90% 
 22461.18 114075.74 

[[2]]
[[2]][[1]]
     50%      90% 
470808.0 845321.7 

[[2]][[2]]
      50%       90% 
 12539.82 202665.48 

[[3]]
[[3]][[1]]
      50%       90% 
 3906.931 10100.830 

[[3]][[2]]
50% 90% 
 NA  NA