2016-09-06 6 views
0

dreht Ich habe einen Datenrahmen, data1:Prevent ifelse() in R von Faktor in numerische

ID <- c('ID1','ID2','ID3','ID4','ID5','ID6','ID7') 
cr <- c(1,1,"d","d","e","e","e") 
hr <- c(TRUE,TRUE,FALSE,TRUE,FALSE,FALSE,FALSE) 
br <- c(FALSE,TRUE,TRUE,TRUE,FALSE,FALSE,FALSE) 
data1 <- data.frame(ID,cr,hr,br) 

    ID cr hr br 
1 ID1 1 TRUE FALSE 
2 ID2 1 TRUE TRUE 
3 ID3 d FALSE TRUE 
4 ID4 d TRUE TRUE 
5 ID5 e FALSE FALSE 
6 ID6 e FALSE FALSE 
7 ID7 e FALSE FALSE 

Ich mag folgende ifelse Anweisung anzuwenden:

first<-2;last<-length(data1) 
for (to_na in first : last){ 
    if(names(data1)[to_na]!="att"){ 
    data1[,to_na]<- 
    ifelse(data1$hr|data1$br ,NA,data1[,to_na]) 
} 

Aber das Ergebnis ist folgendes:

ID cr hr br 
1 ID1 NA NA NA 
2 ID2 NA NA NA 
3 ID3 NA NA NA 
4 ID4 NA NA NA 
5 ID5 3 FALSE FALSE 
6 ID6 3 FALSE FALSE 
7 ID7 3 FALSE FALSE 

Sie werden bemerken, dass "e" in data1 $ cr wurde auf 3 umgewandelt worden, weil die erste Zeile in cr data1 $ mit einer Zahl beginnt (es wandelt diese Spalte in eine numerische Klasse um, anstatt sie als Faktorklasse beizubehalten). Was ist der beste Weg, dies zu vermeiden?

+0

Sie es – akrun

+0

Die Zeile in 'character' Klasse umwandeln können, in dem diese auf den Eingangsdaten abhängig Änderungen passieren - wäre Ihre Lösung, den gesamten Datenrahmen in Zeichenklassen umzuwandeln? – IcedCoffee

+1

"die folgende ifelse Aussage" - es hilft, auch in Wörtern zu sagen, was Sie versuchen zu tun. R hat bereits Funktionen zum Hantieren mit NAs und vielleicht passt einer von ihnen hier. – Frank

Antwort

1

Wahrscheinlich gibt es einen besseren Weg, dies zu tun, aber den Code halten Sie dies tun können:

index <- data1$hr|data1$br 
first<-2;last<-length(data1) 

for (i in first : last){ 
    if(names(data1)[i]!="att"){ 
    data1[index,i] <- NA }}