在R中基于多列字符串匹配创建新变量时mutate覆盖问题求助
解决方法
你的问题确实是第二次mutate语句完全覆盖了第一次生成的use_statin列,导致只有匹配"Lipitor"的行才会被设为1,其他行都变成NA。要解决这个问题,需要把两个判断条件合并到同一个case_when中,用逻辑或(|)来同时检测两种情况:
library(tidyverse) ID <- sprintf("User %d", 1:4) med1 <- c("rosuvastatin", "ezetimibe", "insulin", "Lipitor") med2 <- c("niacin", "insulin", "simvastatin", NA) df <- data.frame(ID, med1, med2) df <- df %>% mutate(use_statin = case_when( # 同时检测是否包含"statin",或者是否是"Lipitor" if_any(starts_with("med"), ~ str_detect(., pattern = "statin")) | if_any(starts_with("med"), ~ str_detect(., pattern = "Lipitor")) ~ 1 )) df$use_statin
运行这段代码后,use_statin列会输出1 NA 1 1,符合你的预期。
你也可以把两个正则表达式合并成一个,简化代码:
df <- df %>% mutate(use_statin = case_when( if_any(starts_with("med"), ~ str_detect(., pattern = "statin|Lipitor")) ~ 1 ))
这样效果是一样的,因为正则表达式里的|表示匹配任意一个指定的字符串。
内容的提问来源于stack exchange,提问作者George Perlman
相关产品推荐
相关产品推荐

