2011-01-11 16 views
3

ich zwei Listen haben (aus einem Multi-Wave-Umfrage), die wie folgt aussehen:Kombination Umfrage Angebote im R/Umkodierung NAs

X1 X2 
1 NA 
NA 2 
NA NA 

Wie kann ich das leicht in ein drittes Element kombinieren, wo die dritte Spalte nimmt immer den Nicht-NA-Wert der Spalte X1 oder X2 und kodiert NA, wenn beide Werte NA & ge;

Antwort

5

Kombination Gavins Verwendung von within und Prasad die Nutzung von ifelse gibt uns eine einfachere Antwort.

within(df, x3 <- ifelse(is.na(x1), x2, x1)) 

Mehrere ifelse Anrufe werden nicht benötigt - wenn beide Werte NA sind, können Sie direkt einen der Werte nehmen nur.

+0

+1 guter Punkt @Richie –

+0

+1 - Gut beobachtet. Schöne Vereinfachung. –

2

Dies muss ein wenig mehr Finesse-ing aufgrund der Möglichkeit, sowohl X1 und X2NA zu sein, aber diese Funktion kann verwendet werden, um Ihr Problem zu lösen:

foo <- function(x) { 
    if(all(nas <- is.na(x))) { 
     NA 
    } else { 
     x[!nas] 
    } 
} 

Wir verwenden die Funktion foo durch Anwendung auf jede Zeile Ihrer Daten (hier habe ich Ihre Daten in einem Objekt namens dat):

> apply(dat, 1, foo) 
[1] 1 2 NA 

Also das gibt uns, was wir wollen. Um dies in Ihrem Objekt gehören, tun wir dies:

> dat <- within(dat, X3 <- apply(dat, 1, foo)) 
> dat 
    X1 X2 X3 
1 1 NA 1 
2 NA 2 2 
3 NA NA NA 
3

Ein anderer Weg ifelse mit:

df <- data.frame(x1 = c(1, NA, NA, 3), x2 = c(NA, 2, NA, 4)) 
> df 
    x1 x2 
1 1 NA 
2 NA 2 
3 NA NA 
4 3 4 

> transform(df, x3 = ifelse(is.na(x1), ifelse(is.na(x2), NA, x2), x1)) 
    x1 x2 x3 
1 1 NA 1 
2 NA 2 2 
3 NA NA NA 
4 3 4 3 
0

Sie nicht sagen, was du getan wollte, wenn beide gültige Zahlen waren, aber man kann mit dem na.rm Argument verwenden entweder pmax oder pmin:

pmax(df$x1, df$x2, na.rm=TRUE) 
# [1] 1 2 NA 4