2016-01-19 13 views
8

Ich habe einen Vektor "a" mit ganzzahligen Werten, von denen einige wegen anderer Teile des Codes 0 werden können, die ausgeführt werden. Ich möchte die Vorkommen von 0 in diesem Vektor durch eine zufällige Probe von einem anderen Vektor "b" ersetzen, den ich habe. Wenn es jedoch mehrere 0 Werte in "a" gibt, möchte ich sie zu allen verschiedenen Samples von "b". So zum Beispiel:Ersetzen bestimmter Werte im Vektor mit verschiedenen Proben von einem anderen Vektor

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

ich die letzten drei 0-Werte von „a“ möchte mit zufälligen Werten in „b“ ersetzt werden, aber ich würde 1, 2 vermeiden möge, oder 3. Das ist schon in einem.

Derzeit verwende ich eine while-Schleife, so:

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

Gibt es einen besseren Weg, dies zu tun? Es sieht so aus, als würde diese doppelte while-Schleife sehr lange dauern.

Antwort

8

Man könnte so etwas wie die folgenden

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

tun wir replace = TRUE nicht so werden die neuen Werte angegeben haben immer verschiedene voneinander.

+1

Vielen Dank! Das ist so viel sauberer! – user5811685

Verwandte Themen