我可以在给定的Case_When TRUE子句中进行多个赋值吗? [英] Can I make multiple assignments within a given case_when true clause?
本文介绍了我可以在给定的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
的问题是接受length
为nrow
或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屋!
查看全文