搜索一系列列的列名字符串和 return 逻辑 (R)

Search for column name string and return logical for a series of columns (R)

示例数据:

example <- data.frame(matrix(NA, ncol=4, nrow=4))
names(example) <- c("reason_code", "d_01", "d_02", "d_03")
example$reason_code <- c("d_01, d_03", "d_01", "d_02", "d_02, d_03")

给予:

  reason_code  d_01 d_02 d_03  
1  d_01, d_03   NA   NA   NA  
2        d_01   NA   NA   NA  
3        d_02   NA   NA   NA  
4  d_02, d_03   NA   NA   NA  

reason_code 列有时包含多个原因代码。我为每个原因代码创建了一个单独的列,并希望在 reason_code 列和 return 逻辑中搜索列名称以指示其存在,如下所示:

library(stringr)

example$d_01 <- str_detect(example$reason_code, "d_01")

捐赠:

  reason_code  d_01 d_02 d_03  
1  d_01, d_03  TRUE   NA   NA  
2        d_01  TRUE   NA   NA  
3        d_02 FALSE   NA   NA  
4  d_02, d_03 FALSE   NA   NA  

我的真实数据有更多原因代码,因此想知道如何使用函数遍历每一列,在 reason_code 列的每一行中搜索列名在进入下一栏之前 returning TRUEFALSE?

P.s。 Whosebug A.I 告诉我。我的头衔可能会被否决或关闭,但是我不知道如何简洁准确地解释我想要的东西。我希望这个例子能说明问题。

我们可以使用 lapply 遍历列并应用 str_detect 检查字符串是否存在。

library(stringr)

example[, -1] <- lapply(names(example[, -1]), function(x) str_detect(example$reason_code, x))
example
#   reason_code  d_01  d_02  d_03
# 1  d_01, d_03  TRUE FALSE  TRUE
# 2        d_01  TRUE FALSE FALSE
# 3        d_02 FALSE  TRUE FALSE
# 4  d_02, d_03 FALSE  TRUE  TRUE

我们也可以只使用第一列开始。在这里,我演示了如何仅从第一列 (example2) 创建所需的输出 (example4)。

example2 <- example[, 1, drop = FALSE]
#   reason_code
# 1  d_01, d_03
# 2        d_01
# 3        d_02
# 4  d_02, d_03

library(dplyr)
library(tidyr)

example3 <- example2 %>% mutate(ID = 1:n()) 

example4 <- example3 %>%
  left_join(example3 %>%
              separate_rows(reason_code, sep = ", ") %>%
              mutate(Flag = TRUE) %>%
              spread(reason_code, Flag, fill = FALSE),
            by = "ID") %>%
  select(-ID)
example4
#   reason_code  d_01  d_02  d_03
# 1  d_01, d_03  TRUE FALSE  TRUE
# 2        d_01  TRUE FALSE FALSE
# 3        d_02 FALSE  TRUE FALSE
# 4  d_02, d_03 FALSE  TRUE  TRUE