2016-01-19 18 views
8

Tamsayı değerlerini içeren bir "a" vektörüne sahibim, bu kodun bir kısmı çalıştırılan kodun diğer bölümleri nedeniyle 0 olabilir. Bu vektördeki 0 oluşumunu, sahip olduğum başka bir "b" vektöründen rastgele bir örnekle değiştirmek istiyorum. Ancak, "a" da birden fazla 0 değeri varsa, bunları "b" den farklı örneklere göndermeyi isterim. Yani örneğin:Vektördeki belirli değerleri başka bir vektördeki farklı örneklerle değiştirme

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

Ben son üç 0 değerlerini istiyoruz olanlar vardır "a", "b" içinde rasgele değerlerle değiştirilmesi, ama ben, 1 2 kullanmaktan kaçınmak istiyoruz, ya da 3. zaten var.

Şu anda, bu yüzden bir süre döngü kullanıyorum:

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

Bunu yapmak için daha iyi bir yolu var mı? Bu çifte benziyor, ilmek uzun sürebilir.

cevap

8

Sen Böylece yeni değerler birbirinin her zaman farklı olacaktır replace = TRUE belirtmediniz aşağıdaki

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)` 

gibi bir şey yapabilirdi.

+1

Teşekkür ederiz! Bu çok daha temiz! – user5811685

İlgili konular