首页 > 解决方案 > 基于多列值的复杂 case_when() 语句 (dplyr)

问题描述

我有一个 data.frame,表格中的单独列中有偏差类别的风险

a<- data.frame(
  Q1_long_name=(sample(c("y","n","m"), 21, replace = T)),
  Q2_long_name=(sample(c("y","n","m"), 21, replace = T)),
  Q3_long_name=(sample(c("y","n","m"), 21, replace = T)),
  Q4_long_name=(sample(c("y","n","m"), 21, replace = T)),
  Q5_long_name=(sample(c("y","n","m"), 21, replace = T)),
  Q6_long_name=(sample(c("y","n","m"), 21, replace = T))
  Q7_long_name=(sample(c("y","n","m"), 21, replace = T))
  )

由于变量的名称很长(其他函数需要),因此我的 case_when() 语句非常长且不可读。有一些像:

a %>% 
mutate(overall_rob=
       case_when(
         Q1_long_name=="y"& Q2_long_name=="n" & Q3_long_name=="n" & Q5_long_name!="m" ~ "high",
         Q1_long_name=="n"| Q2_long_name=="n" | Q3_long_name=="n" | Q5_long_name!="m" ~ "low",
         TRUE ~ "unclear"  ))

我设法通过在使用 case_when() 之前重命名我的变量然后将它们改回来来做到这一点,但它仍然看起来很乱(正如TarJae所指出的那样)。

a %>% 
rename_with(.cols=matches("^Q"), ~ gsub("^(Q[0-9]).*","\\1", .x))

因此,我想知道是否有任何方法可以流线 case_when 使用%in%或类似的东西来一次指定多个条件?如果没有,TarJae的方式肯定会更容易

标签: rdplyrtidyversedata-wrangling

解决方案


您是否正在寻找这样的解决方案?

library(dplyr)
a %>% 
  rename_with(~str_extract(., "^[^_]+(?=_)")) %>% 
  mutate(overall_rob=
           case_when(
             Q1=="y" & Q2=="n" & Q3=="n" & Q5!="m" ~ "high",
             Q1=="n" | Q2=="n" | Q3=="n" | Q5!="m" ~ "low",
             TRUE ~ "unclear"))

推荐阅读