gpt4 book ai didi

r - 我可以在给定的 case_when true 子句中进行多项分配吗?

转载 作者:行者123 更新时间:2023-12-05 04:35:29 25 4
gpt4 key购买 nike

更新:显然这个功能现在计划用于 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 具有完全相同的测试条件,即 Species == "setosa",并且退化情况为 TRUE。我想通过不重复条件来减少这种冗余:一次 调用 case_when(或类似的),尽管分别对 var1、var2 和 var3 使用不同的 eval_on_true 表达式。显然,在此示例中,冗余不是问题,但我的 case_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 创建于 2022-02-09 (v2.0.1)

最佳答案

case_when 的问题是接受一个值 lengthnrow或 1. 因此,你必须欺骗 case_when通过生成 nrow 的列表1 行数据框。访问函数 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 是必需的接受新变量。

关于r - 我可以在给定的 case_when true 子句中进行多项分配吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71023157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com