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

Dplyr mutate生成CODE_SUB字段报错:按ID提取CODE后两位的问题

解决R中mutate生成CODE_SUB字段的报错问题

嘿,我来帮你搞定这个问题~你之前的代码报错是因为对substr()的参数用法搞错啦,咱们一步步来修正:

错误原因分析

你写的substr(which(df$ID == "A"), CODE, start=4, stop=5)有两个核心问题:

  • which(df$ID == "A")返回的是符合条件的行索引,但substr()的第一个参数需要的是要截取的字符串向量;
  • 你把CODE放在了substr()的第二个参数位置,而substr()的参数顺序是substr(x, start, stop),根本没有这个位置的参数,所以才会报unused argument (CODE)的错误。

正确实现代码

首先,先确认你的数据框(可以直接复制这段代码构造测试数据):

library(dplyr)
df <- tibble(
  ID = c("A", "B", "B", "A", "A"),
  CODE = c(45676, 87898, 89998, 45688, 45556)
)

接下来用两种常用方法实现你的需求:

方法1:使用ifelse()

df <- df %>%
  mutate(CODE_SUB = ifelse(ID == "A", 
                          substr(as.character(CODE), start = 4, stop = 5), 
                          NA))

方法2:使用case_when()(更适合多条件场景)

df <- df %>%
  mutate(CODE_SUB = case_when(
    ID == "A" ~ substr(as.character(CODE), 4, 5),
    TRUE ~ NA_character_
  ))

关键注意点

  • 因为CODE是数值型列,必须先用as.character()转成字符型,substr()才能按位置正确截取最后两位;
  • 非"A"的ID情况直接返回NA,完全匹配你期望的结果。

运行后得到的结果就是你想要的:

# A tibble: 5 × 3
  ID    CODE CODE_SUB
  <chr> <dbl> <chr>   
1 A     45676 76      
2 B     87898 NA      
3 B     89998 NA      
4 A     45688 88      
5 A     45556 56      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 08:02:35