【问题标题】:Change factor levels in R using a variable for BOTH factor name AND level order in a data frame使用数据框中的因子名称和级别顺序的变量更改 R 中的因子级别
【发布时间】:2019-04-11 16:34:54
【问题描述】:

我有一个大型数据框 1,其中有很多列是因子。我想更改每个因素的因素级别顺序。

我有一个查找数据框 2 用于正确的因子级别订单。这意味着我可以使用因子变量来引用查找数据框。我可以获取订单并将其放入不同的变量中。到目前为止一切顺利。

简化示例:

d = tibble(
  size = c('small','small','big', NA)
)
d$size = as.factor(d$size)

levels(d$size) # Not what I want.

proper.order = c('small', 'big') # this comes from somewhere else

我可以使用proper.order 更改 d 中的一列。

d$size = factor(d$size, levels = proper.order)

levels(d$size) # What I want.

我想使用变量来引用列名 (size)。

这不起作用:

my.column = 'size'

d[names(d) == my.column] = factor(d[names(d) == my.column], levels = proper.order, exclude = NULL)


levels(d$size) # What I want.
d # Not what I want.

我希望看到重新排序的因素。有时候是这样的。我希望该因子保持其值(显然)。它们都设置为 NA。

我怀疑这是因为d[names(d) == my.column] 是一个小标题,而不是一个因素。但是,为什么因子水平会发生变化?我怎样才能进入小标题并抓住因素?

【问题讨论】:

    标签: r


    【解决方案1】:

    对于多列,我们可以在mutate_at中指定

    library(dplyr)
    d %>% 
       mutate_at(vars(my.column), 
            list(~ factor(., levels = proper.order, exclude = NULL)))
    

    或与fct_relevel 来自forcats

    library(forcats)
    d %>%
        mutate_at(vars(my.column), list(~ fct_relevel(., proper.order))) 
    

    【讨论】:

    • 谢谢。 list 如果是一个功能就不需要了,对吧?那么,对于 mutate_at,d %>% mutate_at(vars(my.column), ~ factor(., levels = proper.order, exclude = NULL)) 也可以吗?
    • @petyar 也可以,不过建议用list换行
    猜你喜欢
    • 2015-03-05
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2016-12-11
    • 2021-06-26
    相关资源
    最近更新 更多