【问题标题】:simulate lapply / loop over a list of parameters在参数列表上模拟 lapply / 循环
【发布时间】:2019-06-22 10:06:48
【问题描述】:

我想模拟一系列参数的频率和严重性。 以下是列表中第一项的情况:

data <- data.frame(
lamda = c(5, 2, 3),
meanlog = c(9, 10, 11), 
sdlog = c(2, 2.1, 2.2))

freq <- rpois(s, data$lamda[1])

freqsev <- lapply(freq, function(k) rlnorm(k, data$meanlog[1], sdlog = data$sdlog[1]))

freq
freqsev

如何设置循环或 lapply 语句来迭代数据中的所有项目? (不仅仅是第一个)。

谢谢。

【问题讨论】:

  • 不可重现。 s 是什么?
  • 对不起,我错过了一行; s

标签: r loops nested lapply


【解决方案1】:

我们可以如下使用map(来自purrr 包,是tidyverse 包的一部分)来创建列表列。内容现在存储在freqfreqsev 列中。

library(tidyverse)

set.seed(123)

s <- 2

data2 <- data %>%
  mutate(freq = map(lamda, ~rpois(s, .x)),
         freqsev = map(freq, ~map(.x, function(k) rlnorm(k, meanlog, sdlog))))

data2$freq
# [[1]]
# [1] 4 7
# 
# [[2]]
# [1] 2 4
# 
# [[3]]
# [1] 6 0

data2$freqsev
# [[1]]
# [[1]][[1]]
# [1]    9330.247   28897.323 2605520.369   20370.283
# 
# [[1]][[2]]
# [1]    645.4047   5206.2183  22461.1778  93729.0634  46892.3129 144595.7492  10110.8606
# 
# 
# [[2]]
# [[2]][[1]]
# [1]   2665.955 938950.074
# 
# [[2]][[2]]
# [1]  21931.9763    354.2858 280122.6952   3147.6681
# 
# 
# [[3]]
# [[3]][[1]]
# [1]   957.5257 13936.3063  6265.3530  1886.0077  5927.8540  1464.5081
# 
# [[3]][[2]]
# numeric(0)

更新

这是替换大于等于 500 的值的方法。

data3 <- data2 %>%
  mutate(capat500 = map(freqsev, ~map(.x, function(y) ifelse(y >= 500, 500, y))))

【讨论】:

  • 这很棒@www,非常感谢!例如,我如何将这些值限制在500?类似capat500 &lt;- ifelse(data2$freqsev &gt;= 500, 500, data2$freqsev)
猜你喜欢
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 2020-06-05
  • 2018-01-15
  • 2012-05-10
相关资源
最近更新 更多