使用mutate和grepl时如何实现多条件逻辑与判断以修改列?
解决方法
你的代码核心逻辑是对的,问题出在grepl的pattern参数没必要用c()包裹单个字符串——grepl接受单个正则表达式字符串作为pattern,用c()会触发向量循环匹配,反而可能导致结果不符合预期。
修正后的代码:
df <- x %>% mutate(col3 = ifelse(grepl("string1", col1) & grepl("string5|string6|string7", col2), "new_string", col1))
逻辑说明:
grepl("string1", col1):判断col1的每个元素是否包含"string1",返回布尔向量grepl("string5|string6|string7", col2):用正则的|实现“或”逻辑,判断col2的每个元素是否包含三个字符串中的任意一个,返回布尔向量- 两个布尔向量用
&做元素级的逻辑与,只有对应位置两个条件都为TRUE时,才会把col3设为"new_string",否则保留col1的原值
如果追求更直观的写法,也可以用stringr包的str_detect(语法更清晰),或者在完全匹配场景下用%in%:
# 用stringr的写法(需先加载library(stringr)) df <- x %>% mutate(col3 = ifelse(str_detect(col1, "string1") & str_detect(col2, "string5|string6|string7"), "new_string", col1)) # 完全匹配场景(不是包含匹配)用==和%in%更准确 df <- x %>% mutate(col3 = ifelse(col1 == "string1" & col2 %in% c("string5", "string6", "string7"), "new_string", col1))
内容的提问来源于stack exchange,提问作者user3670179
相关产品推荐
相关产品推荐

