2012-08-04 17 views
32

Potrzebuję zastąpić poziomy kolumny współczynnika w ramce danych. Na przykład, używając zestawu danych iris, w jaki sposób zamienić dowolne komórki, które zawierają z kolumną setosa w kolumnie?Zastąp zawartość kolumny współczynnika w ramce danych R

Spodziewałem następujące czynności, aby pracować, ale to generuje komunikat ostrzegawczy i po prostu wstawia NAS:

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

Twój przykład z 'iris' prostu działa. Czy możesz powtórzyć swój problem w jakiś inny sposób? W tej chwili trudno zrozumieć, co chcesz robić. – Andrie

+0

Działa dla mnie.Jakie ostrzeżenie otrzymujesz? – sgibb

+1

To zadziałało z przesłoną przy próbie ponownie. Jednak stosując to samo z moim zbiorze daje to: komunikat ostrzegawczy. W '[<- factor' (' * '* tmp, x $ Hweet == "hweet" value = C (NA_integer_,: nieprawidłowy poziom czynnika, NAS generowane – luciano

Odpowiedz

68

Założę się, że problem jest, gdy trzeba zastąpić wartości na nowy, jeden, który nie jest obecnie część poziomów istniejącego faktora:

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

Twój przykład było złe, to działa:

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

To, co bardziej prawdopodobne, stwarza problem, którego było zobaczyć z własnych danych:

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

To będzie działać, jeśli najpierw zwiększyć poziom Opóźnienie:

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

, ale jeśli chcesz zastąpić gatunek A gatunkiem B, lepiej z 'poziomami (iris $ Gatunek) [mecz ("oldspecies", poziomy (iris $ gatunku))] <- "newspecies" ' –

+0

@flodel -.? dokładnie prawo – luciano

+2

+1 Nicea odpowiedź Skąd masz maszynę umysłu czytania :-) – Andrie

8

Do rzeczy, które są sugerujących można po prostu zmienić poziomy używając levels:

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

istnieje jeden sposób, aby zrobić to na wielu kolumnach? Na przykład mam wiele kolumn z "TRU E 'i '' wartości, które chcę przekodować do 'fałszywej 0', '1' – UD1989

+1

@ UD1989, wystarczy użyć coś takiego: 'mydf [] <- lapply (mydf, as.numeric)' –

8

można użyć funkcji revalue z packa ge plyr, aby zastąpić wartości w wektorze czynnikowym.

W przykładzie zastąpić czynnik virginica przez setosa:

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

Co jeśli don' Czy masz starą wartość? // i nie chcemy pobierać starej wartości tylko po to, aby użyć jej w tym metodzie –

2

miałem ten sam problem. To działało lepiej:

Zidentyfikuj którym poziomie chcesz zmodyfikować: levels(iris$Species)

"setosa" "versicolor" "virginica" 

Więc setosa to pierwszy.

Następnie napisać to:

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

bardziej ogólnego rozwiązania, które współpracuje ze wszystkimi ramki danych na raz i gdzie nie trzeba, aby dodać nowe poziomy czynników jest:

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

Dobrą cechą tego kodu jest to, że można przypisać dowolną liczbę wartości w oryginalnej ramce danych naraz, nie tylko jedną wartość, jaką można uzyskać w oryginalnej ramce danych, a także nowe wartości mogą być wartościami losowymi. W ten sposób możesz stworzyć pełną nową losową ramkę danych o tym samym rozmiarze co oryginał.

0

Korzystanie dlpyr::mutate i 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 
Powiązane problemy