2016-07-31 21 views
1

Ich bin ein Anfänger bei R, und versuchen, einen Datenrahmen (MSdatanew) mit ifelse zu reinigen. Ich möchte eine Variable E2_new so ändern, dass sie, wo immer sie als "< 0.057" codiert wurde, jetzt als "0,57" codiert ist. Aber wo immer es nicht als "< 0.057" codiert ist, wollte ich, dass es wie ursprünglich codiert bleibt.Probleme mit der Reinigung eines Datenrahmens mit ifelse

MSdataclean<-MSdatanew 
    MSdataclean$E2_new <- ifelse(MSdataclean$E2_new=="<0.057",0.057,MSdataclean$E2_new) 

Das Ergebnis daraus ist, dass die Variable E2_new selbst verändert wird, wo es nicht „< 0,57“

war
head(MSdatanew$E2_new) 
    [1] 0.102 <0.057 2.797 11.226 5.156 10.032 
    46 Levels: <0.057 >30 0.058 0.080 0.094 0.102 0.109 0.124 0.136 0.147 ... 9.711 

    head(MSdataclean$E2_new) 
    [1] 6.000 0.057 26.000 19.000 32.000 18.000 

Irgendwelche Vorschläge auf, was ich falsch mache?

Antwort

0

Ersetzen Sie einfach die Faktorstufen.

levels(MSdatanew$E2_new)[match("<0.057", levels(MSdatanew$E2_new))] <- "0.057" 

Beispiel

x <- gl(3,2,labels=c("<0","1","2")) 
x 
#[1] <0 <0 1 1 2 2 
#Levels: <0 1 2 

levels(x)[match("<0",levels(x))] <- "0" 
x 
#[1] 0 0 1 1 2 2 
#Levels: 0 1 2 

Wenn Sie statt eines Faktors numerischen Werte wollen, tun:

x <- as.numeric(levels(x))[x] 
x 
#[1] 0 0 1 1 2 2 

Ebenso für Ihre MSdatanew$E2_new, Verwendung:

MSdatanew$E2_new <- as.numeric(levels(MSdatanew$E2_new))[MSdatanew$E2_new] 
+0

Hey - wie cool das ist !! Danke - es funktioniert super! Haben Sie irgendwelche Gedanken, warum der ifelse-Ansatz nicht funktioniert? –

+1

Beide Ansätze haben für das von mir berichtete Problem funktioniert. Aber eine andere Variable hatte einen zweiten Fehler (Werte von "> 30"). Ich habe es vielleicht falsch ausgeführt, aber als ich wieder mit sub() versuchte, um das zu lösen, hatte die erste sub() - Korrektur bereits die "> 30" in NA geändert. Mit dem Level-Ansatz konnte ich jedoch jedes Problem isolieren –

1

Vielleicht "<" mit "" ersetzen, dann in numerischen konvertieren:

# dummy data 
MSdatanew <- data.frame(E2_new = 
          c("0.102","<0.057","2.797","11.226","5.156","10.032")) 
str(MSdatanew) 
# 'data.frame': 6 obs. of 1 variable: 
# $ E2_new: Factor w/ 6 levels "<0.057","0.102",..: 2 1 5 4 6 3 


# sub "<" and convert to numeric 
MSdatanew$E2_new_clean <- 
    as.numeric(sub("<", "", as.character(MSdatanew$E2_new), fixed = TRUE)) 

MSdatanew 
# E2_new E2_new_clean 
# 1 0.102  0.102 
# 2 <0.057  0.057 
# 3 2.797  2.797 
# 4 11.226  11.226 
# 5 5.156  5.156 
# 6 10.032  10.032