r语言 - 在 data.frame 子集上获取咕噜声中的求和/平均值



我想在下面找到跨事件的总和,然后找到模拟中这些总和的平均值:

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 行的数据帧(例如每lamda

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

我们可以使用嵌套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条目求和,并返回双精度类型的向量,而不是包含两个元素的列表。

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

输出:

> 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 

最新更新