我想在以下情况中找到所有事件的总和,然后找出这些总和的平均值:
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
答案 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