问题描述
我正在做一个研究项目,我研究了 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_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,2],2])
rnorm(50,3],3])
rnorm(50,4],4])
.
.
.
rnorm(50,mean= Mean_Data[15,sd=STD_Data[15,4])
有人可以帮助我编写某种循环或应用函数,这样我就不必手动将均值和 sd 值输入到每个 rnorm 函数的均值和 sd 参数值中吗?
解决方法
你可以这样做
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),sd = STD_Data[[groupdId]][k])
}),paste0("mean=",Mean_Data[[groupdId]],",sd=",STD_Data[[groupdId]]))
}),names(Mean_Data))
,
这是一个双 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_4 = runif(15) )