使用dplyr、forcats包基于分组变量数值调整因子水平的方法
最优实现方案
直接使用tidyverse生态下forcats包的fct_reorder()函数即可,该函数天生支持根据另一变量的分组统计结果重排因子水平,无需创建任何中间辅助表,完全符合dplyr的管道语义:
library(tidyverse) # 原始数据 set.seed(1) df = tibble( group = factor(rep(c("a", "b", "c", "d"), each = 5)), x = c(rnorm(5, 0, 1), rnorm(5, 0, 2), rnorm(5, 0, 1.5), rnorm(5, 0, 3)) ) # 一行代码完成因子水平重排 df <- df %>% mutate(group = fct_reorder(.f = group, .x = x, .fun = sd, .desc = TRUE))
参数说明
.f:需要调整水平的目标因子,此处为group.x:用于计算统计量的参考变量,此处为x.fun:分组统计使用的函数,此处指定为标准差sd.desc = TRUE:按统计结果降序排列,默认是升序
结果验证
调用levels(df$group)可查看调整后的因子水平,输出为"d" "b" "c" "a",和你原有方案的输出完全一致,执行效率更高、代码更简洁。
其他可选写法
如果不想使用fct_reorder,也可以通过管道直接传递排序结果,不需要单独保存lev变量,但可读性弱于上述方案:
df <- df %>% mutate(group = fct_relevel(group, ~ {.} %>% group_by(group) %>% summarise(sd = sd(x)) %>% arrange(desc(sd)) %>% pull(group) ))
内容的提问来源于stack exchange,提问作者blrun
相关产品推荐
相关产品推荐

