0

我想将以下 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 行中的每一行分配一个随机样本

4

4 回答 4

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
于 2013-08-27T11:45:44.747 回答
1

如何先制作样本向量,然后根据prob_rand...进行子集化

x <- sample( 1:no_options , 100 , repl = TRUE )
x[ runif(100) > prob_rand ] <- NA
于 2013-08-27T11:45:33.293 回答
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。

于 2013-08-27T12:59:54.390 回答
0

在 data.frame 中可能是?

df = data.frame(r=runif(100))
df$b = ifelse(df$r<0.01,sample(1:2,1),NA)
于 2013-08-27T11:47:55.007 回答