R 使用IFELSE从多个概率生成数据

R 使用IFELSE从多个概率生成数据,r,R,我正在用R编写一些代码,根据特定的条件生成一个数据集,因为这些条件满足某些条件 我有三种可能性 A-0.423,B-0.324和C-0.253 我想运行随机生成的示例runif(50,0,1) 如果生成的数字介于0和0.423之间,我想从rnorm(50,25,4)生成一个值, 如果介于0.423和0.747之间,我想从rnorm(50,28,4.5) 最后,如果介于0.747和1之间,我想从rnorm(50,30,5)生成一个值 我试图使用某种复合函数ifelse来实现这一点,但没有效果 有什

我正在用R编写一些代码,根据特定的条件生成一个数据集,因为这些条件满足某些条件

我有三种可能性 A-0.423,B-0.324和C-0.253

我想运行随机生成的示例
runif(50,0,1)

如果生成的数字介于0和0.423之间,我想从
rnorm(50,25,4)
生成一个值, 如果介于0.423和0.747之间,我想从
rnorm(50,28,4.5)
最后,如果介于0.747和1之间,我想从
rnorm(50,30,5)
生成一个值

我试图使用某种复合函数
ifelse
来实现这一点,但没有效果

有什么建议吗


干杯

正如您所怀疑的,这可以使用
ifelse

u = runif(50, 0, 1)
values = ifelse(u < .423, rnorm(50, 25, 4),
                ifelse(u < .747, rnorm(50, 28, 4.5),
                       rnorm(50, 30, 5)))

您可以结合使用
开关
findInterval
do.call
mapply

使用哪一种可能取决于您希望输出排序的方式

设置开关
findInterval
switch
的组合应该足够了,尽管我认为@DavidRobinson的答案可能更适合初学者。OP:你能用更具体/信息更丰富的标题替换你的标题吗?事实上,@mnel,我不确定
findInterval
switch
是否有效<代码>开关未矢量化…假设有第四种概率需要使用以下值:0.335ifelse(一步一步地研究答案的逻辑可能会有帮助,以了解它在做什么;那么,对您来说,扩展到四个类别而不是三个类别可能更为明显)@user1642166:请看我的最新编辑。它可以很好地扩展到任意数量的均值和方差。@DavidRobinson感谢您的添加。非常有用。只是澄清一下,您所做的添加在rnorm(50,X,Y)的概率和分配范围上做了同样的事情?@user1642166:是的,它做同样的事情。请注意,概率是您给出的数字之间的差异(可以生成为
diff(c(0,423,747,1))
means = c(25, 28, 30)
vars = c(4, 4.5, 5)
probs = c(.423, .324, .253)
samples = sample(1:3, 50, replace=TRUE, prob=probs)
values = rnorm(50, means[samples], vars[samples])
A <- 0.423
B <- 0.324
C <- 0.253
interval <- c(0, cumsum(c(A, B, C)))
random <- runif(50, 0, 1)

rnorm_vals <- function(interval) {
    switch(interval, `1` = list(mean = 25, sd = 4), `2` = list(mean = 25, sd = 4.5), 
        `3` = list(mean = 30, sd = 5))


}

intervals <- findInterval(random, interval, rightmost.closed = T, all.inside = T)



how_many <- table(intervals)

rnorm_calls <- lapply(names(how_many), function(nm) {
    do.call(rnorm, c(n = how_many[[nm]], rnorm_vals(nm)))
})
rnorm_calls

## [[1]]
##  [1] 28.38 18.54 20.52 25.79 27.50 36.86 23.40 20.82 23.75 30.64 27.62
## [12] 20.23 24.21 22.21 20.16 21.73 29.96 27.28 25.68
## 
## [[2]]
##  [1] 24.91 30.90 30.35 26.08 18.74 27.33 23.29 33.80 30.37 27.49 36.78
## [12] 23.03 24.66 21.46 22.62 33.32 16.16
## 
## [[3]]
##  [1] 30.62 29.50 31.19 25.07 24.68 33.25 40.04 33.42 30.81 21.48 32.79
## [12] 25.56 30.98 30.16
## 


# or (will be sorted by )
unlist(rnorm_calls)

##  [1] 28.38 18.54 20.52 25.79 27.50 36.86 23.40 20.82 23.75 30.64 27.62
## [12] 20.23 24.21 22.21 20.16 21.73 29.96 27.28 25.68 24.91 30.90 30.35
## [23] 26.08 18.74 27.33 23.29 33.80 30.37 27.49 36.78 23.03 24.66 21.46
## [34] 22.62 33.32 16.16 30.62 29.50 31.19 25.07 24.68 33.25 40.04 33.42
## [45] 30.81 21.48 32.79 25.56 30.98 30.16
rnorm_details <- lapply(intervals, rnorm_vals)
means <- sapply(rnorm_details, `[[`, "mean")
sds <- sapply(rnorm_details, `[[`, "sd")

mapply(rnorm, n = 1, sd = sds, mean = means)

##  [1] 24.70 24.33 36.22 21.87 25.40 18.39 23.54 26.90 25.81 17.35 19.45
## [12] 18.53 33.88 27.51 21.70 25.06 24.17 35.08 28.24 21.88 29.90 28.18
## [23] 29.08 24.54 30.43 29.27 28.79 22.09 20.77 18.82 21.73 22.99 26.69
## [34] 27.73 26.66 25.32 29.95 30.77 34.89 28.55 22.95 32.45 36.11 29.72
## [45] 39.23 22.39 26.78 23.36 18.06 33.39