2016-01-19 8 views
8

私は整数値を持つベクトル "a"を持っていますが、実行中のコードの他の部分のためにその一部が0になっている可能性があります。私はこのベクトルの0の出現を、私が持っている別のベクトル "b"のランダムなサンプルに置き換えたいと思います。しかし、 "a"に複数の値がある場合は、 "b"と異なるすべてのサンプルにしたいと思います。だから、例えば:ベクトル内の特定の値を別のベクトルの異なるサンプルに置き換えよう

a <- c(1, 2, 3, 0, 0, 0) 
b <- 1:100 

私は最後の3つの0「」「B」内のランダムな値に置き換えられるの値が、私は1を使用して避けたい、2、または3者を希望していますすでに。

現在、私は、whileループを使用しています:

while(0 %in% a) { 
    s = sample(1, b) 
    while(s %in% a) { 
     s = sample(1, b) 
    } 
    a[a==0][1] = s 
} 

これを行うには良い方法はありますか?ループの実行には長い時間がかかることがあります。

答えて

8

あなたは私たちは、新しい値が互いに常に異なるものになりますのでreplace = TRUEを指定していない以下の

indx <- which(!a) # identify the zeroes locations 
# Or less golfed `indx <- which(a == 0)` 
a[indx] <- sample(setdiff(b, a), length(indx)) # replace by a sample from `setdiff(b, a)` 

ような何かを行うことができます。

+1

ありがとうございました!それはとても清潔です! – user5811685