在数据框中使用两个因子名称和水平顺序的变量来更改R中的因子水平

时间:2019-04-11 16:34:55

标签: r

我有一个很大的数据框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]是一个小问题,而不是一个因素。但是,为什么因子水平发生变化?而我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

对于多列,我们可以在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)))