r语言 - 基于多列值的复杂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的方法肯定会更简单

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

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"))

也许像这样?

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

最新更新