【问题标题】:Loop in R to extract list of lists在R中循环以提取列表列表
【发布时间】:2020-03-23 18:17:49
【问题描述】:

我正在模拟泊松分布中的事件数(参数为 9)。对于每个事件,我使用参数为 2 和 1.1 的对数正态分布来模拟事件的价格

我正在运行 100 次模拟(每个模拟代表一年)。代码(我很满意)是:

simul <- list()
for(i in 1:100) {simul[[i]] <- rlnorm (rpois(1, 9), meanlog = 2, sdlog = 1.1) }

我的问题是输出“simul”是一个列表列表,我不知道如何对其应用基本操作。

我希望能够: 1. 限制每个单独的模拟值(由于预算限制) 2. 获得所有模拟值的总和,分别为每一年(有和没有封顶) 3. 获得每一年的平均值(有和没有封顶) 4. 计算每年的第 95 个百分位(有和没有封顶) 5. 将结果输出到数据框中(一列代表总数,一列代表平均值,一列代表百分位数等),每一行代表一年

似乎可行的方法是我提取了个人列表:

sim1 <- simul[1]

我现在可以使用“unlist”来展平列表并应用我想要的任何操作。

sims1 <- data.frame(unlist(sim1), nrow=length(sim1), byrow=F)
sims1 <- subset(sims1, select = c(unlist.sim1.))
colnames(sims1) <- "sim1"

quantile <- data.frame(quantile(sims1$sim1, probs = c(0.95)))

但我不想为列表中的每个子列表编写上述逻辑 100 次...有没有办法解决它?

对此的任何帮助将不胜感激。

【问题讨论】:

    标签: r list nested simulation summary


    【解决方案1】:

    你实际上没有有一个列表列表,你有一个向量列表。对于列表,单个括号子集将返回一个列表,例如simul[1:3] 将返回 simul 的前 3 项的列表,为了保持一致,simul[1] 返回 simul 的第一项的列表。

    要提取元素而不是长度为 1 的列表,请使用 [[simul[[1]] 是一个你不需要运行 unlist() 的向量。

    列表的好处是您可以使用for 循环或lapply/sapply 函数来处理它们。例如

    raw_means = sapply(simul, mean)
    raw_sums = sapply(simul, sum)
    raw_95 = sapply(simul, quantile, probs = 0.95)
    result = data.frame(raw_means, raw_sums, raw_95)
    

    或者用循环,

    raw_means = raw_sums = raw_95 = numeric(length(simul))
    for (i in seq_along(simul)) {
      raw_means[i] = mean(simul[[i]])
      raw_sums[i] = sum(simul[[i]])
      raw_95[i] = quantile(simul[[i]], probs = 0.95)
    }
    result = data.frame(raw_means, raw_sums, raw_95)
    

    当您说“上限”时,我不确定您是指子集还是减少值(例如,pmin),所以我将把它留给您。但我建议创建一个新列表,例如simul_cap = lapply(simul, pmin, 9)(如果这是您想要的操作)并在您的上限列表上运行相同的代码。您甚至可以将汇总统计信息设为函数,因此您最终无需复制粘贴一堆,而是使用 raw_result = foo(simul)cap_result = foo(simul_cap)

    【讨论】:

      猜你喜欢
      • 2020-08-15
      • 2021-08-15
      • 2022-01-09
      • 2021-12-05
      • 1970-01-01
      • 2018-02-15
      • 2015-10-02
      • 2015-07-01
      • 2019-08-22
      相关资源
      最近更新 更多