【问题标题】:Running into syntax errors when trying to simulate a data set using the rnorm function尝试使用 rnorm 函数模拟数据集时遇到语法错误
【发布时间】:2021-08-19 17:51:29
【问题描述】:

我正在做一个研究项目,其中涉及我研究 50 组不同实验大鼠的体重增加情况。每周我都会记录每组大鼠的平均体重以及体重的标准差。目前,我有 4 组大鼠的 15 周数据,但是,我需要所有 50 组大鼠的 15 周数据。 (我每 15 周收到 4 组新的老鼠)。

为了我的研究,我将每周数据记录到两个不同的数据框中。数据框 1 是每个大鼠组的 Mean_Weight df,如下所示:

Mean_Data <- data.frame( Group_1 = runif(15), Group_2 = runif(15), 
    Group_3 = runif(15), Group_4 = runif(15) )

数据框 2 是每个大鼠组的 STD_Weight df,如下所示:

STD_Data <- data.frame( Group_1 = runif(15), Group_2 = runif(15), 
    Group_3 = runif(15), Group_4 = runif(15) )

我正在接近时间紧迫,无法等待获得完整的数据集,因此我试图使用 rnorm 函数来规避这种不便。为了满足我的需要,使用 rnorm 函数的语法如下所示:

rnorm(50, mean= *, sd=*]) 

我的问题是我不知道如何正确编码 rnomrm 函数中 mean 和 sd 参数的值。理想情况下,我只想使用 Mean_Data 和 STD_Data dfs 中每个单元格的值。完成后,它看起来像这样:

rnorm(50, mean= Mean_Data[1,1], sd=STD_Data[1,1]) 
rnorm(50, mean= Mean_Data[1,2], sd=STD_Data[1,2]) 
rnorm(50, mean= Mean_Data[1,3], sd=STD_Data[1,3]) 
rnorm(50, mean= Mean_Data[1,4], sd=STD_Data[1,4]) 
.
.
.
 rnorm(50, mean= Mean_Data[15,4], sd=STD_Data[15,4])

有人可以帮助我编写某种循环或应用函数,这样我就不必手动将均值和 sd 值输入到每个 rnorm 函数的均值和 sd 参数值中?

【问题讨论】:

  • 所以你想为每个Group_*生成15个向量?

标签: r loops apply data-generation


【解决方案1】:

你可以这样做

rnormList <- lapply(names(Mean_Data), function(groupdId) {
  lapply(1:NROW(Mean_Data), function(k) {
    rnorm(n = 50, mean = Mean_Data[[groupdId]][k], sd = STD_Data[[groupdId]][k])
  })
})

要知道什么是什么,你也可以添加类似的名字

rnormList <- setNames(lapply(names(Mean_Data), function(groupdId) {
  setNames(lapply(1:NROW(Mean_Data), function(k) {
    rnorm(n = 50, mean = Mean_Data[[groupdId]][k], sd = STD_Data[[groupdId]][k])
  }), paste0("mean=",Mean_Data[[groupdId]],",sd=",STD_Data[[groupdId]]))
}),names(Mean_Data))

【讨论】:

    【解决方案2】:

    这里是双 Map 单线。

    rand_list <- Map(function(M, S) {do.call(cbind, Map(function(m, s) rnorm(50, m, s), M, S))}, Mean_Data, STD_Data)
    
    str(rand_list)
    #List of 4
    # $ Group_1: num [1:50, 1:15] 0.452 0.447 0.461 0.433 0.457 ...
    # $ Group_2: num [1:50, 1:15] -0.3543 0.6925 -0.0813 -0.3047 0.6171 ...
    # $ Group_3: num [1:50, 1:15] -0.2151 -0.18883 0.00794 0.04713 0.05671 ...
    # $ Group_4: num [1:50, 1:15] 0.911 0.573 0.927 0.626 0.892 ...
    

    列表成员可以被任何人访问

    rand_list$Group_1
    rand_list[["Group_1"]]
    rand_list[[1]]
    

    数据创建代码

    以下内容在创建均值和标准差数据集之前设置 RNG 种子。

    set.seed(2021)    # Make the results reproducible
    Mean_Data <- data.frame( Group_1 = runif(15), Group_2 = runif(15), 
                             Group_3 = runif(15), Group_4 = runif(15) )
    STD_Data <- data.frame( Group_1 = runif(15), Group_2 = runif(15), 
                            Group_3 = runif(15), Group_4 = runif(15) )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      相关资源
      最近更新 更多