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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:18:23