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)

ただし、ここでの問題は、サンプルが 1 回しか実行されないため、if 条件が満たされるたびに、100 行ごとにランダム サンプルではなく同じサンプルが割り当てられることです。

4

4 に答える 4

2

あなたの最初の例はうまくいきません。

for (i in 1:100){ if (runif<0.01){b<-sample(1:2,1)} else {b<-NA}}

2 番目の部分を機能させるには、1 回実行するのではなく、複数回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

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 に答える