2016-05-14 10 views
1

Ich habe zwei Variablen A und BFalscher Ersatz in R

a    b 
234323432  NA 
234324343  NA 
238432788  NA 
6786686  576575 
97892734  NA 
87236488  NA 
234683246  NA 

Ich mag b mit einem whenver b ersetzen ist NA Ich habe versucht, mit

la2$b[is.na(la2$b)] <- la2$a 

ersten drei NA richtig eingesetzt werden, sondern nach der 4. Reihe wird die 5. Reihe von b durch die 4. Reihe von a ersetzt. Gibt es einen bestimmten Grund für einen falschen Ersatz?

a    b 
234323432  234323432 
234324343  234324343 
238432788  238432788 
6786686  576575 
97892734  6786686 
87236488  97892734 
234683246  87236488 

erwartete Ausgabe unter

a    b 
234323432  234323432 
234324343  234324343 
238432788  238432788 
6786686  576575 
97892734  97892734 
87236488  87236488 
234683246  234683246 
+1

Sie müssen die gleiche Auswahllogik auf beiden Seiten der Zuordnung haben. Sie sollten eine Warnung über eine Abweichung bei den Größen erhalten haben. –

Antwort

3

Um die Indizes der beiden Vektoren übereinstimmen, können Sie

la2$b[is.na(la2$b)] <- la2$a[is.na(la2$b)] 
#   a   b 
#1 234323432 234323432 
#2 234324343 234324343 
#3 238432788 238432788 
#4 6786686 576575 
#5 97892734 97892734 
#6 87236488 87236488 
#7 234683246 234683246 

Wenn Rechenzeit Angelegenheiten (im Falle von großen Daten versuchen Sätzen), sollte es besser sein, die Indizes einmal zu berechnen und sie in einem Vektor idx zu speichern, wie von Docendodiscimus.

idx <- is.na(la2$b) 
la2$b[idx] <- la2$a[idx] 

Daten

la2 <- structure(list(a = c(234323432L, 234324343L, 238432788L, 6786686L, 
      97892734L, 87236488L, 234683246L), b = c(NA, NA, NA, 576575L, 
      NA, NA, NA)), .Names = c("a", "b"), class = "data.frame", 
      row.names = c(NA, -7L)) 
+1

Oder, um redundante Berechnung von 'is.na (la2 $ b)' zu vermeiden, können Sie einen Index verwenden: 'idx <- is.na (la2 $ b); la2 $ b [idx] <- la2 $ a [idx] ' –

+0

@docendodiscimus Sie haben natürlich Recht. Eigentlich hatte ich darüber nachgedacht. Ich weiß nie, ob One-Liner gegenüber etwas effizienteren Two-Linern bevorzugt werden ;-) Zwei Befehle mit einem Semikolon auszurichten, ist eine gute Möglichkeit, beides zu erreichen :-) – RHertel

+0

Nichts ist falsch mit deiner One-Liner-Antwort hier :) Ich denke nur es ist eine gute Gelegenheit zu zeigen, wie Sie in vielen Situationen einfach effizienteren Code schreiben können (der Unterschied kann für kleine bis mittlere Daten vernachlässigbar sein, ist aber bei großen Datensätzen sicherlich bemerkbar) –