在R中如何用fct_reorder()根据a列对df的b列设置有序因子排序?
问题解决:将b列转为按a列升序排列的有序因子
你的问题出在两个核心错误上:
- 用
df$b <- factor(c(1,2,3,4,5))直接覆盖了原始b列数据,完全丢失了原本的b值信息 - 使用
fct_reorder()的逻辑不符合需求——你需要的是根据a列升序定义b列的因子水平顺序,而非对已有的错误因子水平重新排序
正确代码实现
library(tidyverse) df <- tibble::tribble( ~color, ~a, ~b, "blue", 1, 2, "green", 100, 200, "purple", 2, 3, "red", 200, 100, "yellow", 3, 1 ) # 1. 获取按a列升序排列后的b值,作为因子的水平顺序 level_order <- df %>% arrange(a) %>% pull(b) # 2. 将b转为有序因子,按指定水平排序并替换为1-5的标签(匹配期望输出) df <- df %>% mutate(b = factor(b, levels = level_order, labels = 1:5, ordered = TRUE)) # 按color列排序(匹配你当前输出的行顺序) arrange(df, color)
输出结果
# A tibble: 5 × 3 color a b <chr> <dbl> <ord> 1 blue 1 1 2 green 100 4 3 purple 2 2 4 red 200 5 5 yellow 3 3
逻辑说明
arrange(a) %>% pull(b):先按a列升序排序数据框,提取对应行的b值,这就是我们需要的因子水平优先级顺序factor(b, levels = level_order, labels = 1:5, ordered = TRUE):将原始b值转换为有序因子,指定水平顺序为level_order,同时把每个水平的显示标签替换为1到5的数字,完美匹配你期望的输出格式
内容的提问来源于stack exchange,提问作者sharon shen
相关产品推荐
相关产品推荐

