首页 > 解决方案 > 使用 case_when 返回相互包含的条件列表

问题描述

我想在数据框上创建一个列表列,它可以使用多列匹配多个条件。我尝试使用case_when,但它不会自行工作,因为它会在满足第一个条件时停止。

一个愚蠢但简单的例子:case2应该总是有满足case1。理想情况下,我想要一个返回类似c("case1", "case2")(preferred) 或list("case1", "case2"). 但是,我有多个条件,因此我想返回满足的每个条件,而无需在案例表达式的右侧明确设置每个相互包含的案例。

mtcars %>%
  mutate(x = case_when(mpg >= 15 & cyl == 6 ~ "case1",
                       mpg >= 10 ~ "case2",
                       cyl >= 7 ~ "case3",
                       mpg >= 10 ~ "case4",
                       mpg >= 10 & cyl >= 5 ~ "case5"))

这可以实现吗?

标签: rlistdplyrcasetidyverse

解决方案


为每个条件换list行以返回一个list

library(dplyr)
out <- mtcars %>%
  mutate(x = case_when(mpg >= 15 & cyl == 6 ~ list("case1"),
                       mpg >= 10 ~ list(c("case1", "case2")),
                       cyl >= 7 ~ list("case3")))

-输出

> head(out)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb            x
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4        case1
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4        case1
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1 case1, case2
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1        case1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 case1, case2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1        case1

推荐阅读