R语言按<、>条件重编码数据框列代码运行失效解决方案
代码错误点说明
你的代码运行结果不符合预期,是几个明确的写法错误导致的:
- 列选择写法错误:
mutate_at中vars(one_of(df$income))的写法不符合语法要求,one_of()需要传入列名的字符串向量,你直接传入df$income是提取了该列的所有数值,根本无法选中目标列;另外你也提到示例数据中收入列实际列名是ingresoph,不是income,列名不匹配也会导致选择失败。 - 阈值与标签不匹配:你给出的规则里第三个区间是
500000 < income <= 2000000,但代码里写的判断阈值是x <=20000000(多写了一个0,阈值放大了10倍),对应的分类标签数值也和规则不一致,存在笔误。 - 虽然
case_when是按顺序逐行判断,前一个条件不满足才会走到下一个判断,你前两个条件的顺序没问题,但显式写全区间上下界可读性更高,也避免后续调整顺序时出逻辑错误;另外没有设置兜底分支,超出区间的值会默认返回NA,最好显式声明返回类型避免类型不一致报错。
可直接运行的修正代码
目前dplyr已经不推荐使用旧版mutate_at写法,建议用mutate直接生成新列(不覆盖原始收入列,方便后续核对或其他计算),代码如下:
library(dplyr) df <- df %>% mutate( # 如果你的列名已经改成income,把下面的ingresoph替换为income即可 income_group = case_when( ingresoph < 130000 ~ "Less than 130000", ingresoph >= 130000 & ingresoph < 500000 ~ "Between 130000 and 500000", ingresoph > 500000 & ingresoph <= 2000000 ~ "Between 500000 and 2000000", TRUE ~ NA_character_ # 所有不符合上述区间的值返回字符型NA ) )
注意:你给出的规则里第三个分类标签写的是
"Between 5000000 and 20000000",和前面描述的500000~2000000区间差了10倍,如果实际需求是500万到2000万的分组,直接把代码里对应判断阈值、标签的数值改成你需要的即可。
如果你确实需要覆盖原收入列,把上面代码里的新列名income_group改成对应列名(ingresoph/income)就行。
内容的提问来源于stack exchange,提问作者Luis Valerin
相关产品推荐
相关产品推荐

