5 min read

`fct_relevel`调整对照组,批量的方案

基于R, fct_relevel来自forcats包。

fct_relevel的例子

为了方便理解函数,一般R默认首个出现的factor是对照组。

f <- factor(c("a", "b", "c", "d"))
fct_relevel(f)
## [1] a b c d
## Levels: a b c d
fct_relevel(f, "c")
## [1] a b c d
## Levels: c a b d
fct_relevel(f, "b", "a")
## [1] a b c d
## Levels: b a c d

设计方案

目标是把一个数据表中,符合要求的变量批量重新设置对照组,条件是各自占比最大。

假设数据,

## .
## 老大 老二 老幺 
##   10   10   80

其中老幺是比例最大的吧。

b %>% head()
## # A tibble: 6 x 3
##       a c     d    
##   <int> <chr> <chr>
## 1     1 老大  老大 
## 2     2 老大  老大 
## 3     3 老大  老大 
## 4     4 老大  老大 
## 5     5 老大  老大 
## 6     6 老大  老大

这里cd虽然一样,但是主要是等会验证批量操作是否可以。

b1 <- b %>% 
  group_by(c) %>% 
  summarise(n = n())
## `summarise()` ungrouping output (override with `.groups` argument)
reference_group <- b1 %>% 
  arrange(desc(n)) %>% 
  .[1,1] %>% .$c
b3 <- b %>% 
  mutate(c = fct_relevel(c, reference_group))
fct_relevel(b$c)
##   [1] 老大 老大 老大 老大 老大 老大 老大 老大 老大 老大 老二 老二 老二 老二 老二
##  [16] 老二 老二 老二 老二 老二 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [31] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [46] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [61] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [76] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [91] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
## Levels: 老大 老二 老幺
fct_relevel(b3$c)
##   [1] 老大 老大 老大 老大 老大 老大 老大 老大 老大 老大 老二 老二 老二 老二 老二
##  [16] 老二 老二 老二 老二 老二 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [31] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [46] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [61] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [76] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [91] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
## Levels: 老幺 老大 老二

这里会发现老幺被调整到第一个level了。

设计函数

relevel_me <- function(b, c) {
  b1 <- b %>% 
    group_by(c) %>% 
    summarise(n = n())
  reference_group <- b1 %>% 
    arrange(desc(n)) %>% 
    .[1,1] %>% .$c
  b3 <- b %>% 
    mutate(c = fct_relevel(c, reference_group))
  b3$c
}

测试函数,使用d变量,发现的确挑战成功了。

fct_relevel(b$d)
##   [1] 老大 老大 老大 老大 老大 老大 老大 老大 老大 老大 老二 老二 老二 老二 老二
##  [16] 老二 老二 老二 老二 老二 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [31] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [46] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [61] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [76] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [91] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
## Levels: 老大 老二 老幺
relevel_me(b, d)
## `summarise()` ungrouping output (override with `.groups` argument)
##   [1] 老大 老大 老大 老大 老大 老大 老大 老大 老大 老大 老二 老二 老二 老二 老二
##  [16] 老二 老二 老二 老二 老二 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [31] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [46] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [61] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [76] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [91] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
## Levels: 老幺 老大 老二

批量完成

使用mutate_at中的vars来完成批量就好了。

b4 <- b %>% 
  mutate_at(vars(c,d),function(x){x = relevel_me(b,x)})
## `summarise()` ungrouping output (override with `.groups` argument)
## `summarise()` ungrouping output (override with `.groups` argument)
fct_relevel(b4$c)
##   [1] 老大 老大 老大 老大 老大 老大 老大 老大 老大 老大 老二 老二 老二 老二 老二
##  [16] 老二 老二 老二 老二 老二 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [31] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [46] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [61] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [76] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [91] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
## Levels: 老幺 老大 老二
fct_relevel(b4$d)
##   [1] 老大 老大 老大 老大 老大 老大 老大 老大 老大 老大 老二 老二 老二 老二 老二
##  [16] 老二 老二 老二 老二 老二 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [31] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [46] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [61] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [76] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
##  [91] 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺 老幺
## Levels: 老幺 老大 老二

结果中,显然cd都调整了,老幺置前。