使用 relevel() 或 fct_level() 迭代参考水平
Iterating over reference levels using relevel() or fct_level()
我在数据集中有几个分类变量,我必须在其中手动更改参考水平。我希望找到一种方法来遍历变量和参考水平的集合,以避免复制和粘贴数十次。
我尝试使用 mutate_at
和 relevel
的组合,试图通过包含我想要的参考水平的向量。这没有用。我一直无法找到任何其他问题来专门解决我的问题的迭代部分。请参考下面的玩具示例。
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 创建
我的意图是执行所需的更改参考级别的操作,而无需明确复制和粘贴每个步骤的代码。这个例子的级别是数字,但我的实际问题包含数字和字符串的混合,所以我不能依靠升序来获得正确的参考级别。
因为您本质上想对每一列应用不同的函数,所以我认为在这里使用 map2
更有意义。怎么样
map2_df(factor_lvls %>% select(cars_factors), c("8", "5", "3"), ~fct_relevel(.x, .y))
这将为您设置级别的顺序。这将创建一个新的 data.frame 而不是更新一个,因此如果您想将其合并到其他 table,您可以 bind_cols()
将数据合并在一起。
我在数据集中有几个分类变量,我必须在其中手动更改参考水平。我希望找到一种方法来遍历变量和参考水平的集合,以避免复制和粘贴数十次。
我尝试使用 mutate_at
和 relevel
的组合,试图通过包含我想要的参考水平的向量。这没有用。我一直无法找到任何其他问题来专门解决我的问题的迭代部分。请参考下面的玩具示例。
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 创建我的意图是执行所需的更改参考级别的操作,而无需明确复制和粘贴每个步骤的代码。这个例子的级别是数字,但我的实际问题包含数字和字符串的混合,所以我不能依靠升序来获得正确的参考级别。
因为您本质上想对每一列应用不同的函数,所以我认为在这里使用 map2
更有意义。怎么样
map2_df(factor_lvls %>% select(cars_factors), c("8", "5", "3"), ~fct_relevel(.x, .y))
这将为您设置级别的顺序。这将创建一个新的 data.frame 而不是更新一个,因此如果您想将其合并到其他 table,您可以 bind_cols()
将数据合并在一起。