我有一个巨大的数据集,其中包含 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() 创建一个最终变量?
虽然我不确定我是否理解你的目标,但我想出了这种标记包含(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