【问题标题】:List of data frames with exponential function draws based on rows in another data frame基于另一个数据帧中的行绘制的具有指数函数的数据帧列表
【发布时间】:2021-05-26 08:27:15
【问题描述】:

我对 R 还很陌生,正在尝试进行一些模拟。 我有一个具有各种设置的群组数据框

n = 10000
ir.1 = c(0.01, 0.02, 0.05)
ir.2 = c(0.1, 0.2, 0.3, 0.4)
setting.1 = c(0.5, 0.9)
setting.2 = c(0.4, 0.6)

cohorts = expand.grid(n = n, ir.1 = ir.1, ir.2 = ir.2, setting.1 = setting.1, setting.2 = setting.2)

基于这些,我想使用每个群组(群组数据框中的每一行)进行模拟。 我一直在尝试使用replicate

sim_list = replicate(n = nrow(cohorts),
            expr = {data.frame(
                            time.1 = rexp(n, ir.1),
                            time.2 = rexp(n, ir.2)
                            )}, simplify = F            
            )

str(sim_list)                                                                                    
List of 48
 $ :'data.frame':       10000 obs. of  2 variables:
  ..$ time.1: num [1:10000] 156.75 68.2 4.81 105.74 29.82 ...
  ..$ time.2: num [1:10000] 5.66 13.08 3.88 3.32 23.99 ...
 $ :'data.frame':       10000 obs. of  2 variables:
  ..$ time.1: num [1:10000] 134.7 48.1 30.9 46 104.2 ...
  ..$ time.2: num [1:10000] 20.57 2.38 1.64 2.49 1.53 ...
................

从这里我确实得到了一个包含 48 个数据帧的列表,每个数据帧有 10000 行,但指数函数绘制似乎每次都基于相同的设置。

我希望 sim_list[[1]] 的抽奖基于 cohorts (cohorts[1,]) 第一行的设置,sim_list[[2]] 的抽奖是基于群组[2,] 等等...

这将导致每个数据帧的 time.1 值的平均值从大约。 20 - 100(基于 ir.1 的值),但它们的范围从大约。 55-58 (相当于使用 ir.1 中 3 个值的平均值进行 rexp 绘制???)

range(lapply(sim_list, function(x) { mean(x[['time.1']])}))
[1] 55.49693 58.35876

问题可能是为此使用replicate 函数,但我不知道该怎么做。创建一个大数据框并按队列编号对它们进行分组?使用某种应用功能?还有什么?

我希望这是有道理的!

【问题讨论】:

    标签: r


    【解决方案1】:

    如果我理解正确,您想为每种参数组合模拟一些数据。您的代码有两个问题,1) 复制没有按照您的想法执行,2) 结果相同的原因是因为它使用了您在开始时定义的相同变量,而不是数据框中的值。

    这是另一种选择

    sim_list = function(cohorts) {
      data.frame(
        time.1 = rexp(cohorts["n"], cohorts["ir.1"]),
        time.2 = rexp(cohorts["n"], cohorts["ir.2"])
      )
    }
    
    res=apply(cohorts,1,sim_list)
    

    检查时间范围。1

    lapply(lapply(res,"[[",1),range)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 2021-11-21
      相关资源
      最近更新 更多