2014-11-12 10 views
12

Ich habe ein einfaches Problem, aber ich konnte die Logik nicht begreifen, um es zu überwinden.NAs sind in subskribierten Zuweisungen nicht erlaubt

Ich habe numerische Vektoren mit NAs und möchte eine bedingungsabhängige Operation auf sie anwenden.

Ein einfaches Beispiel ähnlich wie mein Problem ist:

x <- c(1,3,5,7,NA,2,4,6) 
x[x>=5] <- c(1:8)[x>=5] 
x[x<5] <- (c(1:8)*10)[x<5] 

Es gibt den Fehler „NAs sind nicht in indizierte Zuweisungen erlaubt“, also würde ich gerne wissen, was eine vernünftige Lösung für das sein würde, Da jede Attribution separat ausgeführt wird, funktioniert sie wie erwartet.

würde Ich mag das erwartete Ergebnis haben:

[1] 10 20 3 4 NA 60 70 8 

Vorzugsweise ohne eine for-Schleife machen zu müssen, wie dieser Vorgang bereits in einer Funktion für null Modellierung mit vielen Iterationen, die im Alter nehmen.

Vielen Dank im Voraus, Leonardo

+2

Dies ist sehr interessant. Es scheint, dass Sie ganze Zahlen nicht mit 'NA' kombinieren können, während Sie nur dann subsettieren und zuweisen, wenn Sie mehr als einen Wert auf RHS haben ... i.e. 'x [c (NA, 1)] <- 100' und 'x [NA] <- 100 'funktionieren beide, während' x [c (NA, 1)] <- 100: 101 'oder ' x [NA] <- 100: 101' wird nicht –

+2

Dies ist eine wertvolle Frage, wie es bei dieser Fehlermeldung kommt. Aber es ist wichtig zu beachten, dass, selbst wenn Ihr Code ohne die NA-verursachten Fehler ausgeführt wurde, es nicht das erwartete Ergebnis produzieren würde. Zeile 2 Ihres Codes würde die ursprünglichen Werte von 5 und 7 überschreiben, die Sie verwendet haben, um das Ergebnis von 3 und 4 oben (statt 30 und 40) vorherzusagen, und sie würden 3 und 4 sein, wenn die Zeitlinie 3 aufgerufen wird sie werden 30 und 40. Versuch: 'x [x> = 5 &! is.na (x)] <- c(1:8)[x> = 5 &! is.na (x)]; x [x <5 &! Is.na (x)] <- (c (1: 8) * 10) [x <5 &! Is.na (x)] ' –

Antwort

8

Ihre Logik muss auch NAs in der Teilmenge ausschließen. Siehe das folgende Beispiel. Beachten Sie, dass die Vektoren der Untergruppen gespeichert werden, bevor x geändert wird.

x <- c(1,3,5,7,NA,2,4,6) 
subset1 <- x>=5 & !is.na(x) 
subset2 <- x<5 & !is.na(x) 

x[subset1] <- which(subset1) 
x[subset2] <- 10*which(subset2) 
0

Ich glaube, Sie Zuordnung und Subskribierung sind Vermischungs. Ich glaube, was Sie suchen, ist etwas näher daran:

x <- c(1,3,5,7,NA,2,4,6) 
x.greater <- c(1:8)[x>=5] 
x.less <- (c(1:8)*10)[x<5] 

x.greater 
# 3 4 NA 8 
x.less 
# 10 20 NA 60 70 

result <- c(x.greater, x.less) 
result 
# 3 4 NA 8 10 20 NA 60 70 
Verwandte Themen