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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:10:18