我正在尝试使用 sapply 创建一个矩阵,该矩阵包含 rbeta 使用从数据集中获得的不同指定 alpha 和 beta 的输出。我认为这应该相当简单,但我正在努力。
这里是一些数据
q1 <- c(27, 104)
q2 <- c(25, 121)
q3 <- c(29, 114)
df <- as.data.frame(rbind(q1,q2,q3))
colnames(df) <- c('alpha','beta')
这就是我所做的。这给了我 3 个单独的 rbeta 样本,但我认为它没有按行取正确的值。例如。第一个 rbeta 应该是:
rbeta(I, 27, 104)
I=10
rb <- sapply(1:3, function(x) rbeta(I, df$alpha, df$beta))
有人可以澄清我在这里做错了什么或指出另一个方向吗?
在行上使用
apply
set.seed(42)
apply(df, 1, function(x) rbeta(I, x["alpha"], x["beta"]))
q1 q2 q3
[1,] 0.1841086 0.1242001 0.1931461
[2,] 0.2211195 0.1615636 0.2210664
[3,] 0.2331062 0.1665653 0.1790950
[4,] 0.2228934 0.1953668 0.2208726
[5,] 0.2018876 0.1613773 0.2316363
[6,] 0.2807989 0.2275919 0.2472799
[7,] 0.2023407 0.1606147 0.1802312
[8,] 0.3175574 0.1652301 0.2229498
[9,] 0.2036065 0.2220179 0.1385964
[10,] 0.2680387 0.1564213 0.1738062
或使用
Vectorize
set.seed(42)
Vectorize(rbeta)(I, df$alpha, df$beta)
[,1] [,2] [,3]
[1,] 0.1841086 0.1242001 0.1931461
[2,] 0.2211195 0.1615636 0.2210664
[3,] 0.2331062 0.1665653 0.1790950
[4,] 0.2228934 0.1953668 0.2208726
[5,] 0.2018876 0.1613773 0.2316363
[6,] 0.2807989 0.2275919 0.2472799
[7,] 0.2023407 0.1606147 0.1802312
[8,] 0.3175574 0.1652301 0.2229498
[9,] 0.2036065 0.2220179 0.1385964
[10,] 0.2680387 0.1564213 0.1738062
通常,我们可以使用
Map
或mapply
以向量(或列表)的形式提供参数。如果它们的长度不匹配,比如本例中的10
,元素就会被回收。 mapply
试图简化为矩阵,就像 sapply
与 lapply
相比所做的那样。 (注意:如果您查看 Vectorize
的源代码,还包括 mapply
。)
set.seed(42)
mapply(rbeta, 10, df[, 1], df[, 2])
# [,1] [,2] [,3]
# [1,] 0.1841086 0.1242001 0.1931461
# [2,] 0.2211195 0.1615636 0.2210664
# [3,] 0.2331062 0.1665653 0.1790950
# [4,] 0.2228934 0.1953668 0.2208726
# [5,] 0.2018876 0.1613773 0.2316363
# [6,] 0.2807989 0.2275919 0.2472799
# [7,] 0.2023407 0.1606147 0.1802312
# [8,] 0.3175574 0.1652301 0.2229498
# [9,] 0.2036065 0.2220179 0.1385964
# [10,] 0.2680387 0.1564213 0.1738062
实际上,如果你说你并不真的需要数据框
mapply(rbeta, 10, c(27, 25, 29), c(104, 121, 114))