2016-01-19 10 views
8

Ho un vettore "a" con valori interi, alcuni dei quali potrebbero essere diventati 0 a causa di altre parti del codice in esecuzione. Vorrei sostituire le occorrenze di 0 in questo vettore con un campione casuale di un altro vettore "b" che ho. Tuttavia, se ci sono più valori 0 in "a", mi piacerebbe che fossero tutti campioni diversi da "b". Così, per esempio:Sostituzione di valori specifici nel vettore con campioni diversi da un altro vettore

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

Vorrei ultimi tre 0 valori di "a" da sostituire con valori casuali entro "b", ma vorrebbe evitare di utilizzare 1, 2, o 3. Sono già in a.

Attualmente, sto usando un ciclo while, quindi:

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

Esiste un modo migliore per fare questo? sembra che questo doppio ciclo possa richiedere molto tempo per essere eseguito.

risposta

8

Si potrebbe fare qualcosa di simile al seguente

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

Non abbiamo specificato replace = TRUE così i nuovi valori saranno sempre diversi l'uno dall'altro.

+1

Grazie! È molto più pulito! – user5811685

Problemi correlati