R中每行随机抽样的矢量化解

时间:2013-08-27 11:32:53

标签: r vectorization

我想将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 个答案:

答案 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。