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

