【问题标题】:Get sum / mean in purrr over data.frame subset在 data.frame 子集上获取 purrr 中的总和/平均值
【发布时间】:2019-01-31 20:56:57
【问题描述】:

我想在下面找到出现次数的总和,然后在模拟中找到这些总和的平均值:

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 之和在模拟(s)维度上的平均值: 关于如何实现这一点的任何想法?谢谢!

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

预期尺寸:

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

sum-freqsev 应该是&lt;int [2]&gt; 的列表,即freqsev 中的条目总和。 mean-sum-freqsev 应该是一个数字,只是 sum-freqsevlamda 的平均值

【问题讨论】:

  • 您的预期输出是什么? mean-sum-freqsev 应该是每行一个数字还是只有一个数字?
  • @avid_user 请查看我对预期尺寸的更新; mean-sum-freqsev 应该是每行一个数字。

标签: r dplyr sum purrr


【解决方案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 的条目求和,并返回一个双精度类型的向量,而不是一个包含两个元素的列表。

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 

【讨论】:

  • 太好了,@avid_user!我也想添加百分位数,但将 percentile = freqsev %&gt;% map(~map_dbl(., quantile(c(.50, .90)))) 放在 mutate 函数中似乎不起作用......
  • @VincentRisington quantile(x, c(.50, .90)) 返回两个数字,因此将其应用于freqsev&lt;list [2]&gt; 中的每个向量会为每个&lt;list [2]&gt; 生成两个向量。因此,您不能将其强制为dbl。查看我的更新。
  • 谢谢@avid_user,太好了。我怎么能强制这个,以便百分位数字段是&lt;list [2]&gt; per lamda,即第一项是百分位数 = 0.5,第二个是百分位数 = 0.9?非常感谢。
  • @VincentRisington 每个lamda 都有两个模拟,因此每个模拟将获得两个数字。您建议的方式意味着仅显示第一个模拟的第 50 个百分位,而第二个模拟仅显示第 90 个百分位。这就是你想要的吗?
  • 如果我设置s &lt;- 10,那么百分位字段类型是&lt;list [10]&gt; - 所以我不完全确定百分位函数是否被应用。不应该和定义的百分位列表长度一样吗?
猜你喜欢
  • 1970-01-01
  • 2013-05-22
  • 2021-10-25
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
相关资源
最近更新 更多