2016-05-03 11 views
0

Ich habe einen Datensatz mit vielen numerischen Variablen und einer Zeichenvariablen, die angibt, ob niedrige Werte für diese Beobachtung unterdrückt werden. In Beobachtungen, in denen Werte nicht unterdrückt werden, möchte ich NAs 0 (nur für bestimmte Variablen) ersetzen, und ich kann es nicht herausfinden. Das sind meine Daten:Ersetzen von NAs gemäß den Bedingungen

Was ich tun möchte, ist die Änderung von NA auf 0 in Var 1, wenn unterdrückt = keine. Ich habe versucht,

df$Var1<-if (df$suppressed=='none'&is.na(df$Var1)) 0 
     else df$Var1 

und bekam

Error in if (df$suppressed == "none" & is.na(df$Var1)) 0 else df$Var1 : 
    argument is of length zero 

Gibt es etwas falsch mit meiner, wenn else-Anweisung, oder gibt es eine andere Möglichkeit, dies zu tun?

Hier ist die Struktur meiner Daten:

structure(list(suppressed = structure(c(2L, 2L, 2L, 2L, 1L, 1L, 2L, 3L, 2L, 2L), .Label = c("full", "none", "partial"), class = "factor"), var1 = c(2, NA, 3, NA, 2, 3, 3, NA, 2, NA), var2 = c(6, 6, 7, NA, 6, 6, NA, 6, 7, NA)), .Names = c("suppressed", "var1", "var2"), row.names = c(NA, -10L), class = "data.frame") 
+3

Nur tun 'df [df $ unterdrückt == 'keine' & is.na (df $ var1)," var1 "] <- 0' –

Antwort

1

ifelse() den Trick tun können. Es benötigt drei Argumente - die Bedingung, die if-Ausgabe und die else-Ausgabe.

df$Var1 <- ifelse(df$suppressed == 'none' & is.na(df$Var1), 0, Var1) 

Sie haben keine geschweiften Klammern in Ihrem Code {}.

if(df$suppressed == 'none' & is.na(df$Var1)){ 
    df$Var1 <- 0 
    }else{ 
    df$Var1 <- df$Var1 
} 

Hoffe das hilft.

+0

Es gibt absolut keine Notwendigkeit in' ifelse', wenn Sie nur eine Bedingung haben erfüllen. Warum sollten Sie 'Var1' in den * else * Teil einfügen, wenn es schon da ist? –

+0

stimme ich völlig zu, aber da er versuchte, eine if-Anweisung zu verwenden, wollte ich ihm ifelse() zeigen. Aber ich kann nicht mit dir streiten. –

+0

Auch "df $ var1 == NA" tut nicht, was Sie denken, dass es tut. Ihre zweite Option wird also nicht funktionieren. –