我想将for循环转换为矢量化格式:
for (i in 1:100){ if (runif<0.01){b<-sample(1:2,1)} else {b<-NA}}
我在考虑以下解决方案:
ifelse(runif(100,0,1)<prob_rand, sample(1:no_options,1),NA)
然而,这里的问题是样本只执行一次,所以只要满足if条件,就会为100行中的每一行分配相同的样本而不是随机样本
答案 0 :(得分:2)
你的第一个例子不起作用,我想你的意思是:
for (i in 1:100){ if (runif<0.01){b<-sample(1:2,1)} else {b<-NA}}
要使第二部分工作,而不是运行sample
一次,只需运行i
次。
no_options<-2
prob_rand<-0.5 # 0.01 is too low to verify that it is working.
ifelse(runif(100,0,1)<prob_rand, sample(1:no_options,100,replace=TRUE),NA)
# [1] NA NA NA NA NA 2 1 NA NA NA NA 1 1 NA 1 2 2 2 1 NA 1 NA NA NA 2
# [26] NA 1 NA 1 2 NA NA NA 2 NA 2 1 NA 2 2 2 NA NA 1 1 1 1 NA 2 NA
# [51] 2 NA NA 2 1 1 1 2 NA 1 NA 1 NA 1 1 1 NA NA NA NA 1 NA 2 NA NA
# [76] 1 1 NA 2 NA NA NA NA 2 NA 2 NA 2 2 1 1 1 NA 1 NA NA 2 NA NA 1
答案 1 :(得分:1)
如何先制作样本矢量,然后根据prob_rand
...
x <- sample( 1:no_options , 100 , repl = TRUE )
x[ runif(100) > prob_rand ] <- NA
答案 2 :(得分:0)
在data.frame中可能是?
df = data.frame(r=runif(100))
df$b = ifelse(df$r<0.01,sample(1:2,1),NA)
答案 3 :(得分:0)
您也可以使用rbinom
n <- 100
(runif(n) < 0.1) * sample(2, n, replace = TRUE)
rbinom(n, size = 1, prob = 0.1) * sample(2, n, replace = TRUE)
这将给出0,1,2而不是NA,1,2。