使用dplyr处理dataframe时,如何为有序因子变量指定层级?
如何为多个因子变量指定自定义层级顺序?
问题背景
我有一个名为data的tibble数据框:
library(tibble) data <- tribble( ~"ID", ~"some factor", ~"some other factor", 1L, "low", "high", 2L, "very high", "low", 3L, "very low", "low", 4L, "high", "very high", 5L, "very low", "very low" )
我原本使用forcats的fct()函数,结合dplyr的mutate和across将两个变量转换为因子:
library(dplyr) library(forcats) data <- data %>% mutate(across(starts_with("some"), fct))
转换后的数据框如下:
# A tibble: 5 × 3 ID `some factor` `some other factor` <int> <fct> <fct> 1 1 low high 2 2 very high low 3 3 very low low 4 4 high very high 5 5 very low very low
但这样无法为这类有序因子变量指定层级,我期望的层级顺序为:
order <- c("very low", "low", "high", "very high")
请问如何使用dplyr系列函数实现这一点?我的目标是让ggplot2可视化能遵循该层级顺序。
解决方案
方法1:使用fct_relevel指定自定义层级
直接在across中调用fct_relevel,传入预设的层级顺序即可,该方法会保留因子类型并调整层级:
library(dplyr) library(forcats) order <- c("very low", "low", "high", "very high") data <- data %>% mutate(across(starts_with("some"), ~fct_relevel(.x, order)))
方法2:用factor函数创建有序因子
如果需要明确将变量标记为有序因子(ordered factor),可以使用基础R的factor函数,同时指定levels和ordered=TRUE参数:
order <- c("very low", "low", "high", "very high") data <- data %>% mutate(across(starts_with("some"), ~factor(.x, levels = order, ordered = TRUE)))
方法3:排序后用fct_inorder锁定顺序(可选)
如果数据中观测的顺序可以通过排序匹配目标层级,也可以先排序再用fct_inorder提取顺序,但这种方法不如前两种直接可控:
order <- c("very low", "low", "high", "very high") data <- data %>% arrange(match(`some factor`, order), match(`some other factor`, order)) %>% mutate(across(starts_with("some"), fct_inorder))
验证结果
转换完成后,可通过str()函数查看变量的类型和层级:
str(data)
输出会显示两个因子变量的层级已按预设顺序排列,后续使用ggplot2绘图时会自动遵循该顺序展示。
内容的提问来源于stack exchange,提问作者hpy
相关产品推荐
相关产品推荐

