首页 > 解决方案 > 一行中的文本的多个 case_when

问题描述

数据

我有一个数据框如下:

structure(list(EndoscopyEventRaw = c("", "", "oesophagus:rfa;oesophagus:nac", 
"oesophagus:rfa;oesophagus:nac", "oesophagus:brushings", "oesophagus:rfa;oesophagus:emr;oesophagus:nac", 
"oesophagus:apc", "oesophagus:apc;oesophagus:nac", "oesophagus:apc", 
"")), row.names = c(NA, 10L), class = "data.frame")

目标

我想将这方面的内容提取到一个新列中,可能case_when基于以下规则使用:

 dataframe<-dataframe %>%     mutate(OPCS4ZCode2 = case_when( 
      grepl("nac",EndoscopyEventRaw)~  "CodeForNAC",
      grepl("apc",EndoscopyEventRaw) ~  "CodeForAPC",
      grepl("rfa",EndoscopyEventRaw) ~  "CodeForRFA",
      grepl("grasp",EndoscopyEventRaw) ~  "CodeForGrasp"
    ),
    TRUE ~ ""
  )

问题和预期结果

但是,有些行有多个元素,这些代码被编码到新列中,因此最终结果应该是:

1
2
3 CodeForRFA,CodeForNAC
4 CodeForRFA,CodeForNAC
5 
6 CodeForRFA,CodeForNAC
7 CodeForAPC
8 CodeForAPC,CodeForNAC
9 CodeForAPC
10

当我使用case_when它时,它会在找到第一个匹配项时停止查找。有没有一种方法可以使用或不使用匹配上述所有目标case_when

标签: rdplyr

解决方案


是的,case_when一旦找到匹配项,就会跳过其他条件。一种方法是将数据分成不同的行,然后使用条件case_when并汇总数据。

library(dplyr)

df %>%
  mutate(row = row_number()) %>%
  tidyr::separate_rows(EndoscopyEventRaw, sep = ";") %>%
  mutate(OPCS4ZCode2 = case_when(grepl("nac",EndoscopyEventRaw)~  "CodeForNAC",
                     grepl("apc",EndoscopyEventRaw) ~  "CodeForAPC",
                     grepl("rfa",EndoscopyEventRaw) ~  "CodeForRFA",
                     grepl("grasp",EndoscopyEventRaw) ~  "CodeForGrasp",
                     TRUE ~ "")) %>%
   group_by(row) %>%
   summarise(OPCS4ZCode2 = toString(OPCS4ZCode2)) %>%
   select(-row)

# A tibble: 10 x 1
#   OPCS4ZCode2             
#   <chr>                   
# 1 ""                      
# 2 ""                      
# 3 CodeForRFA, CodeForNAC  
# 4 CodeForRFA, CodeForNAC  
# 5 ""                      
# 6 CodeForRFA, , CodeForNAC
# 7 CodeForAPC              
# 8 CodeForAPC, CodeForNAC  
# 9 CodeForAPC              
#10 ""                      

推荐阅读