Поиск строки имени столбца и возврат логических данных для ряда столбцов (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 и вернуть логическое значение, указывающее на его наличие, как показано ниже:

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 и возврата TRUE или FALSE, прежде чем перейти к следующий столбец?

P.S. Мне сказал ИИ stackoverflow. что мой заголовок, скорее всего, будет отвергнут или закрыт, однако я понятия не имею, как кратко и точно объяснить, чего я хочу. Я надеюсь, что пример делает это ясным.


person James McDonell    schedule 06.03.2018    source источник


Ответы (1)


Мы можем использовать 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
person www    schedule 06.03.2018
comment
Первый вариант обеспечил решение моей непосредственной проблемы. Второе решение было бы предпочтительнее, учитывая, что я использовал довольно неэлегантный метод для добавления столбцов для каждого кода причины, однако, учитывая нехватку времени для моей текущей задачи, у меня не было возможности попытаться заставить его работать. Я буду обновлять, когда я делаю. - person James McDonell; 08.03.2018