r-在尝试使用rnorm函数模拟数据集时遇到语法错误



我正在做一个研究项目,研究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])

有人能帮我写一些循环或应用函数吗?这样我就不必手动在每个rnorm函数的均值和sd参数值中输入均值和sd值了?

这是一个双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]]

数据创建代码

以下内容在创建均值和sd数据集之前设置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) )

您可以使用进行此操作

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))

最新更新