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

R中仅使用tidyverse对Smoking status按字母排序失败如何解决?

问题原因

  • 语法使用错误:dplyr::arrange()中传入带单引号的列名不会被识别为数据框的列,仅会被识别为普通字符串,不会触发按列排序;同时你rename后的列名为Smoking Status(Status首字母大写),arrange中写的Smoking status(status首字母小写)存在大小写不匹配,就算不加引号也无法匹配到对应列。
  • 因子排序规则问题:你原始数据中的smoking_status为因子类型,R中因子默认按定义时的.Label顺序排序,你原始数据的因子水平第一位是Ex smoker、第二位才是Current smoker,因此即使语法正确,默认也不会按字符串的字母顺序排列。

修复方案

仅使用tidyverse生态工具即可完成需求,两种常用实现方式如下:

方式1:仅排序时临时按字母序排列

不需要修改原有因子结构,仅在本次排序时按字符串的字母顺序处理:

smoking_gender_disch_piv_count_ren <- smoking_gender_disch_piv_count %>%
  dplyr::rename(`Smoking Status` = smoking_status) %>%
  # 列名含空格需用反引号包裹,转为字符后按字母序排序
  dplyr::arrange(as.character(`Smoking Status`))
smoking_gender_disch_piv_count_ren

方式2:修改因子水平为字母序,适配后续所有操作

如果后续绘图、统计等操作都需要默认按字母序处理吸烟状态分类,可以直接重设因子水平:

smoking_gender_disch_piv_count_ren <- smoking_gender_disch_piv_count %>%
  dplyr::rename(`Smoking Status` = smoking_status) %>%
  # 用forcats的fct_sort直接将因子水平按字母顺序重排
  dplyr::mutate(`Smoking Status` = forcats::fct_sort(`Smoking Status`)) %>%
  dplyr::arrange(`Smoking Status`)
smoking_gender_disch_piv_count_ren

两种方式输出的排序结果均为:Current smoker → Ex smoker → Never smoked → Non smoker - smoking history unknown → Unknown,符合预期的字母序要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 07:54:00