首页 > 解决方案 > 试图将一些旧的 ifelse 代码转换为 case_when

问题描述

因此,我有一些旧的 ifelse 代码(如下),我正在尝试使用 case_when 重做,但我对此非常缺乏经验。

complete_data$type<-ifelse(grepl("Eneg",complete_data$Sample_code),"Negative",
                           ifelse(grepl("PCRneg",complete_data$Sample_code),"Negative",
                                  ifelse(grepl("DNApos",complete_data$Sample_code),"DNApositive",
                                         ifelse(grepl("PCRpos",complete_data$Sample_code),"PCRpositive",
                                         ifelse(grepl("Empty",complete_data$Sample_code),"Empty","Sample")))))

我最初的尝试让第一条线工作

complete_data$type <- case_when((grepl("Eneg", complete_data$Sample_code) ~ "Negative"))

但是,到目前为止,我尝试获取其他 ifelse 语句的尝试都失败了。有人有什么建议吗?

任何帮助,将不胜感激

标签: rtidyverse

解决方案


您可以使用str_detect/grepl进行模式匹配并按case_when以下方式使用。

library(dplyr)
library(stringr)

complete_data %>%
  mutate(type = case_when(str_detect(Sample_code, 'Eneg|PCRneg') ~ 'Negative', 
                          str_detect(Sample_code, 'DNApos') ~ 'DNApositive', 
                          str_detect(Sample_code, 'PCRpos') ~ 'PCRpositive',
                          str_detect(Sample_code, 'Empty') ~ 'Empty', 
                          TRUE ~ 'Sample')) -> complete_data

推荐阅读