You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言中fct_relevel/factor设置因子顺序后数据显示无变化的问题

R语言因子水平顺序调整常见误区:因子水平≠数据行排序

我在R语言中尝试手动调整数据集内organism变量的因子顺序,先后调用fct_relevel函数以及直接使用factor函数,通过levels()查看因子顺序显示正确,但数据集里的实际数据显示顺序并未改变,无法定位问题。

可复现代码

pacman::p_load(tidyverse)

dat <- data.frame(
    stringsAsFactors = FALSE,
    record_id = c(281L,94L,2L,
                  56L,133L,390L,272L,121L,279L,343L,314L,
                  324L,116L,225L,378L,72L,37L,254L,103L,249L,
                  319L,384L,47L,135L,39L,212L,35L,252L,1L,
                  112L,391L,88L,171L,283L,105L,131L,311L,
                  53L,150L,203L,220L,312L,4L,164L,385L,354L,
                  13L,266L,308L,111L),
    esbl_markers = c("CTX-M-27",
                     "CTX-M-15","CTX-M-15","VEB-6","CTX-M-15",
                     "CTX-M-15","CTX-M-27","CTX-M-27","CTX-M-15",
                     "CTX-M-15","CTX-M-15","CTX-M-15","CTX-M-15",
                     "CTX-M-15","CTX-M-15","VEB-6","CTX-M-15","CTX-M-15",
                     "CTX-M-15","CTX-M-15","CTX-M-15","SHV-2",
                     "CTX-M-15","CTX-M-15","CTX-M-3","CTX-M-27",
                     "CTX-M-15","CTX-M-15, OXY-1-1","CTX-M-15",
                     "SHV-187, CTX-M-15","CTX-M-15","CTX-M-15","CTX-M-15",
                     "SHV-187","CTX-M-15","CTX-M-15","CTX-M-15",
                     "CTX-M-15","CTX-M-15","SHV-7","CTX-M-15",
                     "CTX-M-15","CTX-M-27","CTX-M-15","CTX-M-15","CTX-M-3",
                     "CTX-M-15","CTX-M-15","CTX-M-15","CTX-M-15"),
    organism = as.factor(c("Klebsiella pneumoniae",
                           "Escherichia coli","Escherichia coli",
                           "Escherichia coli","Escherichia coli","Other",
                           "Klebsiella oxytoca",
                           "Escherichia coli","Klebsiella pneumoniae",
                           "Klebsiella pneumoniae","Klebsiella pneumoniae",
                           "Klebsiella pneumoniae",
                           "Escherichia coli","Escherichia coli","Other",
                           "Escherichia coli","Escherichia coli",
                           "Escherichia coli","Escherichia coli",
                           "Escherichia coli",
                           "Klebsiella pneumoniae","Other","Escherichia coli",
                           "Escherichia coli","Escherichia coli",
                           "Escherichia coli","Escherichia coli",
                           "Escherichia coli","Escherichia coli",
                           "Escherichia coli","Other",
                           "Escherichia coli","Escherichia coli",
                           "Klebsiella pneumoniae","Escherichia coli",
                           "Escherichia coli","Klebsiella pneumoniae",
                           "Escherichia coli",
                           "Escherichia coli","Escherichia coli",
                           "Escherichia coli","Klebsiella pneumoniae",
                           "Escherichia coli","Escherichia coli","Other",
                           "Klebsiella pneumoniae",
                           "Escherichia coli","Klebsiella oxytoca",
                           "Klebsiella pneumoniae","Escherichia coli"))
)

clean_dat <- dat |> 
    mutate(organism = fct_relevel(organism, c("Escherichia coli", "Klebsiella pneumoniae", "Klebsiella oxytoca", "Other")))

clean_dat <- dat |>
    ungroup() |> 
    mutate(organism = fct_relevel(organism, "Klebsiella oxytoca", after = 2))

levels(clean_dat$organism)
#> [1] "Escherichia coli"      "Klebsiella pneumoniae" "Klebsiella oxytoca"   
#> [4] "Other"
head(clean_dat)
#>   record_id esbl_markers              organism
#> 1       281     CTX-M-27 Klebsiella pneumoniae
#> 2        94     CTX-M-15      Escherichia coli
#> 3         2     CTX-M-15      Escherichia coli
#> 4        56        VEB-6      Escherichia coli
#> 5       133     CTX-M-15      Escherichia coli
#> 6       390     CTX-M-15                 Other

clean_dat <- dat |> 
    mutate(organism = factor(organism, levels = c("Escherichia coli", "Klebsiella pneumoniae", "Klebsiella oxytoca", "Other")))

问题原因分析

你混淆了因子水平的顺序和数据行的排序两个概念:

  • 因子水平的顺序:控制的是统计分析(如绘图、分组汇总)时的分组展示顺序,不会改变数据集中行的原始排列
  • 数据行的排序:指的是数据集里各行的先后顺序,和因子水平本身无关,需要主动调用排序函数调整

另外,你之前的代码存在一个小错误:第一次用fct_relevel生成的clean_dat被第二次的赋值直接覆盖,导致第一次的调整操作无效,后续写代码时要注意避免重复赋值覆盖结果。

解决方法

如果需要让数据行按照你设定的因子水平顺序排列,可在调整因子水平后,使用arrange()函数对数据集排序:

# 调整因子水平并按因子顺序排序数据
clean_dat <- dat |> 
  mutate(organism = factor(organism, levels = c("Escherichia coli", "Klebsiella pneumoniae", "Klebsiella oxytoca", "Other"))) |>
  arrange(organism)

# 查看排序后的结果
head(clean_dat)

运行上述代码后,数据行会按照你定义的因子水平顺序排列,同时levels(clean_dat$organism)仍会保持正确的顺序,满足后续分析或展示需求。

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:17:32