{r setup, include=FALSE} knitr::opts_chunk$set(eval = FALSE) {r echo=FALSE, message=FALSE, warning=FALSE} library(tidyverse)
基于R, fct_relevel来自forcats包。
fct_relevel的例子
为了方便理解函数,一般R默认首个出现的factor是对照组。
{r} f <- factor(c("a", "b", "c", "d")) fct_relevel(f) fct_relevel(f, "c") fct_relevel(f, "b", "a")
设计方案
目标是把一个数据表中,符合要求的变量批量重新设置对照组,条件是各自占比最大。
假设数据,
{r echo=FALSE, message=FALSE, warning=FALSE} library(tidyverse) b = data_frame(a = 1:100) b <- b %>% mutate(c = case_when( a < 11 ~ '老大', a < 21 ~ '老二', TRUE ~ '老幺' )) %>% # mutate(c = as.factor(c)) %>% mutate(d = c) b %>% .$c %>% table()
其中老幺是比例最大的吧。
{r} b %>% head()
这里c和d虽然一样,但是主要是等会验证批量操作是否可以。
{r} 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)) fct_relevel(b$c) fct_relevel(b3$c)
这里会发现老幺被调整到第一个level了。
设计函数
{r} 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变量,发现的确挑战成功了。
{r} fct_relevel(b$d) relevel_me(b, d)
批量完成
使用mutate_at中的vars来完成批量就好了。
{r} b4 <- b %>% mutate_at(vars(c,d),function(x){x = relevel_me(b,x)}) fct_relevel(b4$c) fct_relevel(b4$d)
结果中,显然c和d都调整了,老幺置前。