用R转换罗马数字病理分期为阿拉伯数字结果不符,如何修正?
罗马数字病理分期转阿拉伯数字的代码修正
问题背景
要把数据框pheno_df里pathologic_stage列的罗马数字分期(比如"stage i"、"stage ii")转换成对应的阿拉伯数字(1、2等),但现有代码输出结果不符合预期。
现有代码与问题
现有代码:
pheno_df$pathologic_stage <- gsub("stage ","",pheno_df$pathologic_stage) as.numeric(factor(pheno_df$pathologic_stage))
当前输出:
3 2 3 3 2 5
期望输出:
2 1 2 2 1 4
数据样本:
> dput(pheno_df$pathologic_stage) c("stage ii", "stage i", "stage ii", "stage ii", "stage i", "stage iv")
问题根源
factor()函数默认按字母顺序生成水平,虽然罗马数字的字母顺序本身符合逻辑,但如果数据中存在其他分期值(比如"iii"、"v"),会导致factor的水平顺序和期望的数字映射错位;要是数据里缺某个分期,factor还会自动跳过对应水平,进一步打乱对应关系。
修正代码
手动指定factor的levels参数,明确罗马数字的顺序,保证映射准确:
# 提取罗马数字部分(保留原列,避免覆盖) pheno_df$stage_roman <- gsub("stage ", "", pheno_df$pathologic_stage) # 定义分期的罗马数字顺序,按需扩展 stage_order <- c("i", "ii", "iii", "iv", "v") # 转换为指定顺序的因子,再转阿拉伯数字 pheno_df$stage_numeric <- as.numeric(factor(pheno_df$stage_roman, levels = stage_order))
测试结果
用提供的样本数据运行,输出为:
2 1 2 2 1 4
完全符合期望。
补充说明
如果数据里还有更高级的分期(比如"vi"),只要在stage_order里按顺序添加对应的罗马数字,就能自动映射到正确的阿拉伯数字。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

