基于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 老大 老大
这里c
和d
虽然一样,但是主要是等会验证批量操作是否可以。
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: 老幺 老大 老二
结果中,显然c
和d
都调整了,老幺
置前。