R语言中基于其他列特定字符生成新数据集列的实现问题
问题原因拆解
你代码报错和结果不符合预期的核心问题如下:
- 正则匹配用法错误:
^1是表示「以1开头」的正则规则,不能用==直接做相等判断,需要用正则匹配函数grepl() - 字段判断逻辑错误:需求要求判断
longDesciptions.desc.en_US是否包含Plage,但你的代码里错误判断了longDesciptions.sectionId字段 - 未处理NA值:当列值为NA时,逻辑判断会返回NA,无法满足
if语句要求的TRUE/FALSE输入,直接触发报错 - 多条件顺序错误:你写的两个
if是独立判断,就算第一个判断给字段赋值了A,第二个判断也会直接覆盖成B,逻辑完全混乱
可行解决方案
下面提供两种可直接运行的实现方案:
方案1:基础R实现(无需额外安装包)
# 初始化新列,默认值为NA df$JobDescrip <- NA_character_ # 构造两个判断条件,grepl遇到NA会自动返回FALSE,不会触发报错 cond_start_with_1 <- grepl("^1", df$externalCode, perl = TRUE) cond_has_plage <- grepl("Plage", df$longDesciptions.desc.en_US, perl = TRUE) # 按规则赋值 df$JobDescrip[cond_start_with_1 & cond_has_plage] <- "A" df$JobDescrip[cond_start_with_1 & !cond_has_plage] <- "B"
运行后匹配你提供的样例数据结果:第2行赋值为A,第3、4、5行赋值为B,其余行保持NA,完全符合需求。
方案2:tidyverse实现(代码可读性更高、易维护)
library(dplyr) library(stringr) df <- df %>% mutate(JobDescrip = case_when( str_starts(externalCode, "1") & str_detect(longDesciptions.desc.en_US, "Plage") ~ "A", str_starts(externalCode, "1") & !str_detect(longDesciptions.desc.en_US, "Plage") ~ "B", .default = NA_character_ ))
内容的提问来源于stack exchange,提问作者MariKo
相关产品推荐
相关产品推荐

