2016-12-02 11 views
0

Das Problem scheint zu einfach zu sein, um überhaupt hier aufgestellt zu werden; aber ich kann keine Lösung finden, die funktioniert. Ich habe einen Datenrahmen (df) von 3 Spalten; davon ist eine Faktor-Spalte (df$Colors) mit 3 Ebenen ("Blau", "Rot" und "Schwarz"). In einer anderen Spalte (df$Outliers) sind numerische Werte, von denen einige "NA" sind. Ich möchte eine weitere Spalte hinzufügen (sagen wir df$NewColors) ähnlich wie df$Colors wo für "NA" in df$Outliers, df$NewColors = "Orange". Ich fügte hinzu, eine zusätzliche Ebene wie folgt:Für NA in einer Spalte; Faktorstufen einer anderen Spalte können nicht geändert werden

> levels(df$Colors) <- c(levels(df$Colors), "Orange") 

jedoch die neu hinzugefügte Spalte alte „Farbe“ Werte zu verwenden scheint, anstatt sie durch „Orange“ ersetzt, wo es should.Also es ganzzahlige Werte für Faktoren erzeugt von df$Colors aber ich möchte die alte kategoriale Variable behalten. Der Code, den ich verwendet wird, ist wie folgt:

>levels(df$Color) <- c(levels(df$Color),"Orange") 

> for (i in 1:nrow(df)) { 
    df$NewColors[i] <- ifelse (is.na(df$Outliers[i]), "Orange", df$Colors[i]) 
    } 

Wohin gehe ich falsch?
Hier sind die Beispieldaten:

> BodyLength <- rep(seq(1,9),2) 
> Colors <- rep(c("Black","Blue","Red"),6) 
> Outliers <- c(seq(1,8),"NA",seq(1,8),"NA") 
> df <- data.frame(BodyLength,Colors,Outliers) 
+1

„NA“ ist von NA anders ersetzt werden. –

Antwort

0

Dies funktioniert:

df$Colors_new <- df$Colors 
levels(df$Colors_new) <- c(levels(df$Colors_new),"Orange") 
df$Colors_new[which(df$Outliers == "NA")] <- "Orange" 

Beachten Sie, dass Ihre NA sind nicht real NAs sondern Text, der NA sagt. Um es zu tun richtig müssen Beispieldaten sein:

Outliers <- c(seq(1,8),NA,seq(1,8),NA) 

Dann könnten Sie verwenden:

df$Colors_new[is.na(df$Outliers)] <- "Orange" 
+0

Funktioniert wie ein Zauber ... ich fühle mich wie ein Idiot! Danke @JonGrub – Mansi

+0

Sie müssen nicht. Fragen zu stellen ist die Art, wie ich das gelernt habe :) Übrigens: Wenn du meine Antwort magst, würdest du das bitte annehmen? – JonGrub

0

Wie @ joel.wilson erwähnt Ihre Daten beispielsweise in nicht richtig ist, dass es das Zeichen „NA“ anstelle ein fehlender Wert (NA) gibt. Wenn das das Problem verursacht könnten Sie dies mit justieren die folgenden:

df$Outliers[which(df$Outliers=="NA")]<-NA 

Abgesehen davon, dass so etwas wie dies sollte arbeiten, was Sie zu erreichen versuchen:

df$new.colors<-ifelse(is.na(df$Outliers),"Orange",as.character(df$Colors)) 

returns „Orange“, wenn df $ Ausreißer ist NA und gibt ansonsten df $ Colors zurück. Verwenden Sie as.factor, um diese neue Variable wieder zu einem Faktor zu machen.

0

Wie im Kommentar bemerkt NA ist nicht "NA". Wenn Sie "NA" haben, werden Ihre Ausreißer als Zeichendaten behandelt, da die numerischen Werte erzwungen werden. Außerdem gibt is.na("NA") FALSE zurück. Wenn Ihr NA entsprechend behandelt wird, sollte Ihr Code in Ordnung sein. Sie könnten auch die Verwendung von replace als Alternative zu einer Schleife in Betracht ziehen.

BodyLength <- rep(seq(1,9),2) 
Colors <- rep(c("Black","Blue","Red"),6) 
Outliers <- c(seq(1,8),NA,seq(1,8),NA) 
df <- data.frame(BodyLength,Colors,Outliers) 
df$newColors = df$Colors 
levels(df$newColors) = c(levels(df$Colors),"Orange") 
df$newColors = replace(df$newColors,is.na(df$Outliers),"Orange") 

Wenn Sie bestimmt Ausreißer als Zeichen zu haben, mit dem Wert "NA" sollte dann is.na mit

Verwandte Themen