使用relevel()或fct_level()遍历参考级别

时间:2019-07-02 18:00:29

标签: r dplyr purrr forcats

我在数据集中有几个类别变量,必须手动更改参考级别。我希望找到一种方法来遍历变量和引用级别的集合,以避免重复粘贴数十次。

我尝试使用mutate_atrelevel的组合,试图通过包含我所需参考水平的向量。这没用。我无法找到其他任何可以解决我的问题的迭代部分的问题。请参考下面的玩具示例。

library(tidyverse)

mtcars <- as_tibble(mtcars)

#this step is for the autofill functionality within `select`
#handy for larger collections of variables
cars_factors <- mtcars %>% select(cyl, gear, carb) %>% names()

factor_lvls <- mtcars %>% 
  mutate_at(cars_factors, factor) %>% 
  select(cars_factors) 

#Before releveling, levels are taken in ascending numerical order
factor_lvls %>% map(unique)
#> $cyl
#> [1] 6 4 8
#> Levels: 4 6 8
#> 
#> $gear
#> [1] 4 3 5
#> Levels: 3 4 5
#> 
#> $carb
#> [1] 4 1 2 3 6 8
#> Levels: 1 2 3 4 6 8

#changing reference levels
factor_lvls$cyl <- relevel(factor_lvls$cyl, ref = "8")
factor_lvls$gear <- relevel(factor_lvls$gear, ref = "5")
factor_lvls$carb <- relevel(factor_lvls$carb, ref = "3")

#note, reference level order has changed. the first level now reflects ref levels above
factor_lvls %>% map(unique)
#> $cyl
#> [1] 6 4 8
#> Levels: 8 4 6
#> 
#> $gear
#> [1] 4 3 5
#> Levels: 5 3 4
#> 
#> $carb
#> [1] 4 1 2 3 6 8
#> Levels: 3 1 2 4 6 8

#my attempt
factor_lvls %>% mutate_at(cars_factors, fct_relevel(., c("8", "5", "3")))
#> Error: `f` must be a factor (or character vector or numeric vector).

reprex package(v0.2.1)于2019-07-02创建

我的目的是执行所需的更改参考级别的操作,而无需明确复制和粘贴每个步骤的代码。此示例的级别是数字,但是我的实际问题包含数字和字符串的混合,因此我不能依靠升序来获得正确的参考级别。

1 个答案:

答案 0 :(得分:1)

由于您本质上想对每个列应用不同的功能,因此我认为在这里使用map2更有意义。怎么样

map2_df(factor_lvls %>% select(cars_factors),  c("8", "5", "3"), ~fct_relevel(.x, .y))

这将为您设置级别的顺序。这将创建一个新的data.frame而不是更新一个data.frame,因此,如果要将其合并到其他表中,则可以将数据bind_cols()在一起。