2017-03-08 5 views
0

Ich versuche forcats::fct_relevel() zu verwenden Faktoren in mydf nivellieren die Reihenfolge des Faktors in Nachschlag zum Spiel:Wie Faktor in Rbased auf einem anderen Tisch nivellieren

library(dplyr) 
library(forcats) 

mydf <- data.frame(id=1:10, f=as.factor(c("feb", "mar","mar","mar","jan","jan", "apr", "apr","mar", "jan"))) 

lookup <- data.frame(f=as.factor(c("jan", "feb", "mar", "apr"))) #the order i want 

levels(mydf$f) #defaults to alphabetical 

mydf %>% group_by(f) %>% dplyr::summarise(n = n()) #want this in the order of lookup$f 

mydf %>% 
    mutate(f = fct_relevel(f, levels(mydf$f))) %>% #the problem line 
    group_by(f) %>% dplyr::summarise(n = n()) 

Ich verstehe, dass ich manuell die Ebene definieren innerhalb fct_relevel(), aber ich kann es mir nicht leisten, es jedes Mal hart zu programmieren. Vielen Dank.

+2

Warum nicht einfach 'levels (mydf $ f) <- lookup $ f' zuerst? – thelatemail

+0

Ok so 'mydf%>% mutieren (f = Faktor (f, levels = lookup $ f))%>% group_by (f)%>% dplyr :: summarize (n = n())' funktioniert sicher. Gibt es ein Forkats-Äquivalent? – sullij

+0

ok fair genug danke. – sullij

Antwort

0

Meine erste Neigung wäre einfach, es zu beheben, bevor sie eine Analyse zu tun:

levels(mydf$f) <- lookup$f 

... die Sie in Ihrem verrohrt Aufruf wie einbetten könnten:

mydf %>% mutate(f = factor(f, levels=lookup$f)) %>% group_by(f) %>% dplyr::summarise(n = n()) 

Sonst könnte man lvls_reorder verwenden etwas klobig:

mydf %>% 
    mutate(f = lvls_reorder(f, match(lookup$f, levels(f)))) %>% 
    group_by(f) %>% 
    dplyr::summarise(n = n()) 
Verwandte Themen