在多个真实条件下使用case_when

问题描述

这段代码

library(dplyr)

letters = c("A","B","C")
numbers = c(4,15,35)

df <- data.frame(letters,numbers)

df %>% 
  mutate(category = case_when(
    numbers %% 5 == 0 ~ "fizz",numbers %% 7 == 0 ~ "buzz",TRUE ~ as.character(numbers)
  )
  )

产生如下所示的数据框:

  letters numbers category
1       A       4        4
2       B      15     fizz
3       C      35     fizz

我想看到的结果是这个数据框:

  letters numbers category
1       A       4        4
2       B      15     fizz
3       C      35     fizz
4       C      35     buzz

由于C行有两个条件成立,因此我想为每个条件创建一行。我该如何实现?

解决方法

case_when / ifelse仅返回条件之一的输出。您可以执行以下操作:

library(dplyr)
df %>% 
  mutate(category = case_when(
    numbers %% 5 == 0 & numbers %% 7 == 0 ~ "fizz,buzz",numbers %% 5 == 0 ~ "fizz",numbers %% 7 == 0 ~ "buzz",TRUE ~ as.character(numbers))) %>% 
    tidyr::separate_rows(category)

#  letters numbers category
#  <chr>     <dbl> <chr>   
#1 A             4 4       
#2 B            15 fizz    
#3 C            35 fizz    
#4 C            35 buzz