使用 R 中数据帧的不同 alpha 和 beta 值应用或循环 rbeta

问题描述 投票:0回答:2

我正在尝试使用 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))

有人可以澄清我在这里做错了什么或指出另一个方向吗?

r apply sapply
2个回答
0
投票

在行上使用

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

0
投票

通常,我们可以使用

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))
© www.soinside.com 2019 - 2024. All rights reserved.