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
相关产品推荐
相关产品推荐

