我想在下面找到跨事件的总和,然后找到模拟中这些总和的平均值:
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
应该是一个数字,只是每lamda
sum-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