根据一组字符串是否出现在R的多个列中来改变新变量

5cg8jx4n  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(117)

我有参与者正在使用的药物的临床数据,我想创建新的药物类别二元变量(例如,他汀类药物的使用)。为此,我想在多列(药物1、药物2等)中搜索一组字符串(药物名称)来定义新变量。
给定以下代码:

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(if_any(starts_with("med"), ~ str_detect(., pattern = "statin")) ~ 1))%>%
  mutate(use_statin = case_when(if_any(starts_with("med"), ~ str_detect(., pattern = "Lipitor")) ~ 1))
df$use_statin

我希望use_statin列显示"1NA11",但实际上显示的是"NANANA1"。看起来第二个变异代码行覆盖了第一个。

rhfm7lfc

rhfm7lfc1#

我们可以使用一个if_any,其中pattern将其中任何一个匹配为|OR),这样它就不会覆盖第一个匹配

library(dplyr)
library(stringr)
df %>% 
 mutate(use_statin = case_when(if_any(starts_with("med"),
       ~ str_detect(.x, pattern = "statin|Lipitor"))~ 1))
  • 输出
ID         med1        med2 use_statin
1 User  1 rosuvastatin      niacin          1
2 User  2    ezetimibe     insulin         NA
3 User  3      insulin simvastatin          1
4 User  4      Lipitor        <NA>          1

在OP的代码中,use_statin列是首先使用statin匹配创建的,然后使用Lipitor匹配覆盖输出。

df%>%
  mutate(use_statin = case_when(if_any(starts_with("med"),
   ~ str_detect(., pattern = "statin")) ~ 1))%>%
  mutate(use_statin = +(case_when(if_any(starts_with("med"), 
  ~ str_detect(., pattern = "Lipitor")) ~ 1)|use_statin))
  • 输出
ID         med1        med2 use_statin
1 User  1 rosuvastatin      niacin          1
2 User  2    ezetimibe     insulin         NA
3 User  3      insulin simvastatin          1
4 User  4      Lipitor        <NA>          1

相关问题