2012-08-04 16 views
32

Ich brauche die Stufen eines Faktors Spalte in einem Datenrahmen zu ersetzen. Wie würde ich unter Verwendung des Datensatzes iris als Beispiel die Zellen, die virginica enthalten, durch setosa in der Spalte Spezies ersetzen?Inhalt Faktor Spalte in R Datenrahmen

erwartete ich die Arbeit folgen, aber es gibt eine Warnmeldung aus und fügt einfach NAs:

iris$Species[iris$Species == 'virginica'] <- 'setosa' 
+0

Ihr Beispiel mit 'iris' funktioniert einfach. Können Sie Ihr Problem auf andere Weise replizieren? Im Moment ist es schwer zu verstehen, was Sie tun möchten. – Andrie

+0

Funktioniert für mich.Welche Warnmeldung erhalten Sie? – sgibb

+1

Es funktionierte mit Iris beim erneuten Versuch. Das Anwenden derselben auf mein Dataset ergibt jedoch folgendes: Warnmeldung: In '[<-. Factor' (' * tmp * ', x $ Hweet ==" hweet ", Wert = c (NA_integer_,: ungültiger Faktorlevel, NAs generated – luciano

Antwort

68

Ich wette, das Problem ist, wenn Sie versuchen, Werte durch einen neuen zu ersetzen, das nicht ist derzeit Teil der Ebenen bestehenden Faktor:

levels(iris$Species) 
# [1] "setosa"  "versicolor" "virginica" 

Ihr Beispiel war schlecht, das funktioniert:

iris$Species[iris$Species == 'virginica'] <- 'setosa' 

Dies ist, was eher das Problem schafft Sie mit Ihren eigenen Daten zu sehen waren:

iris$Species[iris$Species == 'virginica'] <- 'new.species' 
# Warning message: 
# In `[<-.factor`(`*tmp*`, iris$Species == "virginica", value = c(1L, : 
# invalid factor level, NAs generated 

Es wird funktionieren, wenn Sie zuerst Ihre Faktorstufen erhöhen:

levels(iris$Species) <- c(levels(iris$Species), "new.species") 
iris$Species[iris$Species == 'virginica'] <- 'new.species' 
+10

Wenn Sie aber die Art A durch die Art B ersetzen möchten, sind Sie besser mit 'Ebenen (Iris $ Species) [match ("oldspecies", levels (iris $ Species))] <- "newsspecies" ' –

+0

@flodel - genau richtig – luciano

+2

+1 Schöne Antwort Wo hast du deine Gedankenlesemaschine her :-) – Andrie

8

Für die Dinge, die Sie darauf hindeutet, sind Sie können nur die Ebenen der Verwendung ändern levels:

levels(iris$Species)[3] <- 'new' 
+0

Gibt es eine? One-Shot-Möglichkeit, es auf mehreren Spalten zu tun? Zum Beispiel habe ich mehrere Spalten mit 'TRU E 'und' FALSE 'Werte, die ich auf' 0 ',' 1 ' – UD1989

+1

@ UD1989 umkodieren will, verwenden Sie einfach so etwas wie: 'mydf [] <- lapply (mydf, as.numeric)' –

8

Sie die Funktion revalue vom packa verwenden können ge plyr um Werte in einem Faktorvektor zu ersetzen.

data(iris) 
library(plyr) 
revalue(iris$Species, c("virginica" = "setosa")) -> iris$Species 
+0

Was ist, wenn ich nicht' t Hast du den alten Wert? // und möchte den alten Wert nicht abrufen, nur um ihn in dieser Methode zu verwenden –

2

Ich hatte das gleiche Problem:

In Ihrem Beispiel den Faktor virginica durch setosa zu ersetzen. Das funktionierte besser:

identifizieren, die Sie ändern möchten Level: levels(iris$Species)

"setosa" "versicolor" "virginica" 

So setosa die erste ist.

Dann schreibe dies:

 levels(iris$Species)[1] <-"new name" 
1

eine allgemeinere Lösung, die auf einmal mit allen Datenrahmen funktioniert und wo Sie neue Faktoren Ebenen nicht wissen, ist hinzufügen:

data.mtx <- as.matrix(data.df) 
data.mtx[which(data.mtx == "old.value.to.replace")] <- "new.value" 
data.df <- as.data.frame(data.mtx) 

Eine nette Eigenschaft dieses Codes ist, dass Sie so viele Werte wie Sie in Ihrem ursprünglichen Datenrahmen auf einmal zuweisen können, nicht nur eine "new.value", und die neuen Werte können zufällige Werte sein. Auf diese Weise können Sie einen vollständigen neuen Datenrahmen mit der gleichen Größe wie das Original erstellen.

0

Mit dlpyr::mutate und forcats::fct_recode:

library(dplyr) 
library(forcats) 

iris <- iris %>% 
    mutate(Species = fct_recode(Species, 
    "Virginica" = "virginica", 
    "Versicolor" = "versicolor" 
)) 

iris %>% 
    count(Species) 

# A tibble: 3 x 2 
    Species  n 
     <fctr> <int> 
1  setosa 50 
2 Versicolor 50 
3 Virginica 50 
Verwandte Themen