搜索列名字符串并返回一系列列的逻辑(R)[重复]

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

这个问题在这里已有答案:

示例数据:

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列中搜索列名并返回逻辑以指示其存在,如下所示:

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列的每一行中搜索列名并返回TRUEFALSE,然后继续下一栏?

附: stackoverflow A.I.告诉我。我的头衔可能会被低估或关闭,但我不知道如何解释我的简洁和准确。我希望这个例子能说清楚。

r stringr
1个回答
0
投票

我们可以使用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

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

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
© www.soinside.com 2019 - 2024. All rights reserved.