2015-01-28 21 views
24

Bu muhtemelen basit ve sormak için aptal hissediyorum. Bir veri çerçevesindeki bir faktörün seviyesini, mutasyon kullanarak değiştirmek istiyorum. Basit bir örnek:dplyr mutate ile faktör düzeylerini değiştirme

library("dplyr") 
dat <- data.frame(x = factor("A"), y = 1) 
mutate(dat,levels(x) = "B") 

alıyorum: Neden bu çalışmıyor

Error: Unexpected '=' in "mutate(dat,levels(x) =" 

? Faktör seviyelerini mutasyonla nasıl değiştirebilirim?

+3

Belki 'dat%>% (x = faktörü (x, etiketler = 'B'))' BTW, boru operatörü Yani kodunuzda – akrun

+0

doğru değildir mutasyona ben (düzeylerini kullanamazsınız) mutasyonda mı? Değişkeni tekrar bir faktör olarak kodlamalı mıyım? Hmm ... (% <>% tamamlanmalı, borulara girmeli ve dat değerini atamalıdır) – user3393472

+0

Evet, x'i değiştirmek istiyorum. Ben x (x) 'i mutasyona uğratmak istediğimi anlayabilmek için "level (x)" in yeterli olacağını düşündüm. Sanırım bu "tasarım" ile bu şekilde çalıştığı için bir tasarım seçimi. – user3393472

cevap

22

ben düzgün soruyu anlamadım tam emin değilim ama mutate() ile cyl faktör düzeylerini değiştirmek isterseniz bunu yapabilirsiniz:

df <- mtcars %>% mutate(cyl = factor(cyl, levels = c(4, 6, 8))) 

Sen alacağı:

#> str(df$cyl) 
# Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ... 
22

Belki bu plyr aradığınız :: değeri TPTU işlevi:

mutate(dat, x = revalue(x, c("A" = "B"))) 

Plyr :: mapvalues ​​öğelerini de görebilirsiniz.

18

@hadley tarafından hazırlanan yeni forcats paketiyle (RStudio blogunda announcement), bu da kolaydır.

mutasyon (dat x = fct_recode (x, "B" = "A"))

Forcats @hadley hangi plyr uygun değildir, aynı zamanda tidyverse (announcement) bir parçası olan (Duyuruda ilk yorumu okuyun).

10

dplyr'dan recode işlevini kullanabilirsiniz.

df <- iris %>% 
    mutate(Species = recode(Species, setosa = "SETOSA", 
     versicolor = "VERSICOLOR", 
     virginica = "VIRGINICA" 
    ) 
) 
+2

Düzeltmenin yalnızca vektörlerde çalıştığını unutmayın, çalışan bir sürüm için PaulFrater'ın yanıtına bakın. – Magnus

7

, yeterince itibar puanı yok çünkü açıklama, sadece bir vektör çalışır recode yüzden @ yukarıdaki kod Stefano'nın cevabı Benim anlayış

df <- iris %>% 
    mutate(Species = recode(Species, 
    setosa = "SETOSA", 
    versicolor = "VERSICOLOR", 
    virginica = "VIRGINICA") 
) 
4

olmalıdır olamaz Halihazırda kabul edilen cevap sadece seviyelerinin etiketlerinin etiketlerinin sırasını değiştirir (yani, faktör seviyelerinin nasıl çağrıldığı).(Bunlar alfanümerik sırayla kodlanmış olmasıdır belirterek seviyeleri gerekli olmaz) faktörü haline

açın cyl: seviyeleri ve etiket arasındaki farkı göstermek için, aşağıdaki örneği ele

mtcars2 <- mtcars %>% mutate(cyl = factor(cyl, levels = c(4, 6, 8))) 
    mtcars2$cyl[1:5] 
    #[1] 6 6 4 6 8 
    #Levels: 4 6 8 

Değiştir seviyeleri sırası (ancak etiket kendisi: silindir hala aynı sütun)

mtcars3 <- mtcars2 %>% mutate(cyl = factor(cyl, levels = c(8, 6, 4))) 
    mtcars3$cyl[1:5] 
    #[1] 6 6 4 6 8 
    #Levels: 8 6 4 
    all(mtcars3$cyl==mtcars2$cyl) 
    #[1] TRUE 
.210

atama yeni etiketler cyl etiket sırası için oldu: C (8, 6, 4), aşağıdaki gibi, bu nedenle yeni etiketlerini belirten: bu sütun, ilk sütun nasıl farklı

mtcars4 <- mtcars3 %>% mutate(cyl = factor(cyl, labels = c("new_value_for_8", 
                   "new_value_for_6", 
                   "new_value_for_4"))) 
    mtcars4$cyl[1:5] 
    #[1] new_value_for_6 new_value_for_6 new_value_for_4 new_value_for_6 new_value_for_8 
    #Levels: new_value_for_8 new_value_for_6 new_value_for_4 

Not:

all(as.character(mtcars4$cyl)!=mtcars3$cyl) 
    #[1] TRUE 
    #Note: TRUE here indicates that all values are unequal because I used != instead of == 
    #as.character() was required as the levels were numeric and thus not comparable to a character vector 

Diğer ayrıntılar:

biz cylkullanmanın düzeylerini değiştirmek için olsaydı mtcars3 yerine, aynı sonucu elde etmek için etiketleri farklı şekilde belirtmemiz gerekir. mtcars2 için etiket sırası ise c (4, 6, 8) mtcars3$cyl ve mtcars4$cyl farklı

#change labels of mtcars2 (order used to be: c(4, 6, 8) 
    mtcars5 <- mtcars2 %>% mutate(cyl = factor(cyl, labels = c("new_value_for_4", 
                   "new_value_for_6", 
                   "new_value_for_8"))) 

, aşağıdaki gibi dolayısıyla etiket mtcars4$cyl arasında ve mtcars5$cyl böylece aynı olan, yeni etiketler belirtin bile seviyeleri düzeylerinin farklı bir sırası vardır.

mtcars4$cyl[1:5] 
    #[1] new_value_for_6 new_value_for_6 new_value_for_4 new_value_for_6 new_value_for_8 
    #Levels: new_value_for_8 new_value_for_6 new_value_for_4 

    mtcars5$cyl[1:5] 
    #[1] new_value_for_6 new_value_for_6 new_value_for_4 new_value_for_6 new_value_for_8 
    #Levels: new_value_for_4 new_value_for_6 new_value_for_8 

    all(mtcars4$cyl==mtcars5$cyl) 
    #[1] TRUE 

    levels(mtcars4$cyl) == levels(mtcars5$cyl) 
    #1] FALSE TRUE FALSE 
İlgili konular