Grepl 具有逻辑运算符 AND 跨多个字母数字列

问题描述 投票:0回答:1

我有一个巨大的数据集,其中包含 25 列医疗代码。每一行代表一次医疗就诊。我需要创建一个新列来标记每行上两个代码一起出现的位置。换句话说,我想跨多个列进行 grep 并标记两个代码在医疗访问中一起出现的位置。

我考虑为我想要 grep 的每个字母数字代码创建一个新变量,然后使用 case_when() 创建一个最终变量,但是有没有更快的方法来做到这一点?

这是一个玩具数据集:

diag_p <- c('a1', 'a4', 'c5', 'a4', 'b1')
odiag1 <- c('b1', 'b2', 'c3', 'd4', 'e5')
odiag2 <- c('f1', 'g4', 'h4', 'i5', 'a1')
odiag3 <- c('a6', 'b1', 'c8', 'a1', 'e10')
sample_df <- data.frame(diag_p, odiag1, odiag2, odiag3)

此代码可以很好地使用 | 进行跨列搜索。和两个 grep 语句,并在块末尾添加 '>1',这将计算跨列的多个匹配项,但它工作得不太正确。我需要它匹配(a1 或 a4)和(b1 或 b4)。

new_df <- sample_df %>% 
  mutate(new_col = case_when(
    rowSums(sapply(select(., diag_p, odiag1:odiag3), function(x) 
        (grepl("a[14]", x)) | (grepl("b[14]", x))
    )) > 1 ~ "yeah!", 
    TRUE ~ "nope"))

有没有一种方法可以做到这一点,而无需为每个 grep 语句创建一个新列,然后使用 case_when() 创建一个最终变量?

r sapply grepl alphanumeric icd
1个回答
0
投票

虽然我不确定我是否理解你的目标,但我想出了这种标记包含(a1或a4)和(b1或b4)的行的方法。

diag_p <- c('a1', 'a4', 'c5', 'a4', 'b1')
odiag1 <- c('b1', 'b2', 'c3', 'd4', 'e5')
odiag2 <- c('f1', 'g4', 'h4', 'i5', 'a1')
odiag3 <- c('a6', 'b1', 'c8', 'a1', 'e10')
sample_df <- data.frame(diag_p, odiag1, odiag2, odiag3)

library(tidyverse)

sample_df |> rowwise() |> 
  mutate(Flag = any(str_detect(c_across(diag_p:odiag3), "a(1|4)")) &
           any(str_detect(c_across(diag_p:odiag3), "b(1|4)")))
#> # A tibble: 5 × 5
#> # Rowwise: 
#>   diag_p odiag1 odiag2 odiag3 Flag 
#>   <chr>  <chr>  <chr>  <chr>  <lgl>
#> 1 a1     b1     f1     a6     TRUE 
#> 2 a4     b2     g4     b1     TRUE 
#> 3 c5     c3     h4     c8     FALSE
#> 4 a4     d4     i5     a1     FALSE
#> 5 b1     e5     a1     e10    TRUE

创建于 2025-01-10,使用 reprex v2.1.1

© www.soinside.com 2019 - 2024. All rights reserved.