我想将以下 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 行中的每一行分配一个随机样本
我想将以下 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 行中的每一行分配一个随机样本
你的第一个例子不起作用,我想你的意思是:
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
如何先制作样本向量,然后根据prob_rand
...进行子集化
x <- sample( 1:no_options , 100 , repl = TRUE )
x[ runif(100) > prob_rand ] <- NA
你也可以使用 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。
在 data.frame 中可能是?
df = data.frame(r=runif(100))
df$b = ifelse(df$r<0.01,sample(1:2,1),NA)