您可以使用mapply 来做到这一点,这是一个*apply 函数,它为提供的函数接受多个参数,并将相应位置的值应用于它们的参数。在这种情况下,它将返回一个矩阵,其中列是rnorm 样本。
这是一个简单的例子
#set seed for reproducibility
set.seed(1234)
myNorms <- mapply(function(x, mean, sd) rnorm(x, mean, sd), 500, 0:2, c(1, 1, 5))
head(myNorms, 5)
[,1] [,2] [,3]
[1,] -1.2070657 1.9847800 -4.026667
[2,] 0.2774292 -0.2247379 3.507334
[3,] 1.0844412 1.7097262 -5.695726
[4,] -2.3456977 0.8907800 5.176854
[5,] 0.4291247 2.7826079 5.514759
这将从每个分布中抽取 500 个元素。 {mean 0, sd 1}, {mean 1, sd 1} 和 {mean 2, sd 5} 的法线。
我们可以检查手段
colMeans(myNorms)
[1] 0.001838821 0.944966777 2.158396474
标准差
apply(myNorms, 2, sd)
[1] 1.0348139 0.9585917 4.6880564
您可以用 data.frame 中的向量替换最后两个参数。
根据 roland 在 OP 中的评论,可以单独使用 rnorm 而不使用 mapplyas r* 函数系列将采用向量参数作为均值(和 sd 在适当的情况下)参数。但它的用法可能与预期略有不同。对于上面的mapply 示例,函数将是
set.seed(1234)
myNorms <- matrix(rnorm(500L * 3L,
mean=rep(0:2, each=500L), sd=rep(c(1, 1, 5), each=500L)),
500)
因此,每次随机抽取都必须重复所需分布的均值和标准差。
检查,我们得到与上面相同的方法:
colMeans(myNorms)
[1] 0.001838821 0.944966777 2.158396474