【问题标题】:How to relevel factor in Rbased on another table如何根据另一个表重新调整 R 中的因子
【发布时间】:2017-03-08 11:43:13
【问题描述】:

我正在尝试使用 forcats::fct_relevel() 重新调整 mydf 中的因子以匹配查找中因子的顺序:

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())

我知道我可以在fct_relevel() 中手动定义级别,但我不能每次都对其进行硬编码。谢谢。

【问题讨论】:

  • 为什么不先levels(mydf$f) &lt;- lookup$f
  • 好的,所以mydf %&gt;% mutate(f = factor(f, levels=lookup$f)) %&gt;% group_by(f) %&gt;% dplyr::summarise(n = n()) 肯定有效。是否有 forcats 等效项?
  • 好的,谢谢。
  • 也许是lvls_reorder,虽然有点复杂-mydf %&gt;% mutate(f = lvls_reorder(f, match(lookup$f, levels(f)))) %&gt;% group_by(f) %&gt;% dplyr::summarise(n = n())
  • 如果您想发布正式答案,我很乐意接受。

标签: r dplyr factors


【解决方案1】:

我的第一个倾向是在进行任何分析之前修复它:

levels(mydf$f) <- lookup$f

...您可以将其嵌入到管道调用中,例如:

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

否则你可以用有点笨拙的方式使用lvls_reorder

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多