我可以在给定的Case_When TRUE子句中进行多个赋值吗? [英] Can I make multiple assignments within a given case_when true clause?

查看:0
本文介绍了我可以在给定的Case_When TRUE子句中进行多个赋值吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

更新:显然,此功能现在计划用于dplyr,如下所述:https://github.com/tidyverse/dplyr/pull/6145

在SQL中,当给定的情况得到验证时,可以为多个变量赋值--比如var1和var2,其结构类似

Case When Condition Then var1=x,var2=y

dplyr::Case_When(或tidyVerse中的任何其他内容)是否支持这一有用的功能),如果支持,如何支持?!

请注意,在下面的示例中,var1、var2和var3具有完全相同的测试条件,即物种==&setosa";,退化情况为真。我希望通过不重复以下条件来减少这种冗余:一个调用Case_When(或类似的),尽管分别为var1、var2和var3使用不同的val_on_true表达式。显然,在本例中冗余不是问题,但我的案例_When在现实生活中变得非常庞大和复杂。

library(tidyverse)

# create example data
set.seed(1337)
data <- iris %>%
  sample_n(5) %>%
  select(Petal.Length, Petal.Width, Species) %>%
  as_tibble()
data
#> # A tibble: 5 × 3
#>   Petal.Length Petal.Width Species   
#>          <dbl>       <dbl> <fct>     
#> 1          5.5         1.8 virginica 
#> 2          5           1.9 virginica 
#> 3          1.5         0.2 setosa    
#> 4          5.9         2.3 virginica 
#> 5          4.1         1.3 versicolor
data %>%
  mutate(var1 = case_when(Species == "setosa" ~ "green", TRUE ~ "blue"),
         var2 = case_when(Species == "setosa" ~ Petal.Length * 99, TRUE ~ Petal.Length),
         var3 = case_when(Species == "setosa" ~ as.Date("2002-12-01"), TRUE ~ as.Date("2003-12-02")))
#> # A tibble: 5 × 6
#>   Petal.Length Petal.Width Species    var1   var2 var3      
#>          <dbl>       <dbl> <fct>      <chr> <dbl> <date>    
#> 1          5.5         1.8 virginica  blue    5.5 2003-12-02
#> 2          5           1.9 virginica  blue    5   2003-12-02
#> 3          1.5         0.2 setosa     green 148.  2002-12-01
#> 4          5.9         2.3 virginica  blue    5.9 2003-12-02
#> 5          4.1         1.3 versicolor blue    4.1 2003-12-02

reprex package(v2.0.1)于2022-02-09创建

推荐答案

case_when的问题是接受lengthnrow或1的值。因此,您必须通过生成nrow单行数据帧列表来欺骗case_when。 存取器函数lod(定义如下)构造一个单行数据帧列表:

lod <- function(...) {
  args <- list(...)
  do.call(function(...) mapply(data.frame, ..., SIMPLIFY = FALSE), args)
}

lod(x = 1:4, y = letters[1:4])

[[1]]
  x y
1 1 a

[[2]]
  x y
1 2 b

[[3]]
  x y
1 3 c

[[4]]
  x y
1 4 d

然后编写case_when语句,使用lod将变量分组,如下所示:

data |>
  mutate(case_when(Species == "setosa" ~
                     lod(var1 = "green",
                         var2 = Petal.Length * 99,
                         var3 = as.Date("2002-12-01")),
                   TRUE ~
                     lod(var1 = "blue",
                         var2 = Petal.Length,
                         var3 = as.Date("2003-12-02"))) |>
         bind_rows())

+ # A tibble: 5 x 6
  Petal.Length Petal.Width Species    var1   var2 var3      
         <dbl>       <dbl> <fct>      <chr> <dbl> <date>    
1          5.5         1.8 virginica  blue    5.5 2003-12-02
2          5           1.9 virginica  blue    5   2003-12-02
3          1.5         0.2 setosa     green 148.  2002-12-01
4          5.9         2.3 virginica  blue    5.9 2003-12-02
5          4.1         1.3 versicolor blue    4.1 2003-12-02

最后一个bind_rows需要mutate才能接受新变量。

这篇关于我可以在给定的Case_When TRUE子句中进行多个赋值吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆