簡體   English   中英

使用relevel()或fct_level()遍歷參考級別

[英]Iterating over reference levels using relevel() or fct_level()

我在數據集中有幾個類別變量,必須手動更改參考級別。 我希望找到一種方法來遍歷變量和引用級別的集合,以避免重復粘貼數十次。

我使用的組合嘗試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軟件包 (v0.2.1)創建於2019-07-02

我的意圖是執行所需的更改參考級別的操作,而無需為每個步驟明確復制和粘貼代碼。 本示例的級別是數字,但是我的實際問題包含數字和字符串的混合,因此我不能依靠升序來正確設置參考級別。

由於您本質上想對每個列應用不同的功能,因此我認為在這里使用map2更有意義。 怎么樣

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

這將為您設置級別的順序。 這將創建一個新的data.frame而不是對其進行更新,因此,如果要將其合並到其他表中,則只需將數據bind_cols()在一起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM