case_when 函数中的动态语句
Dynamic statements in a case_when function
我有以下数据:
test <- tibble(id = 1:4, name = letters[1:4], revenue = seq(100, 400, 100))
据此,我创建了滞后变量:
test_lagged <-
test %>%
mutate(
revenue_lag_1 = lag(revenue, 1),
revenue_lag_2 = lag(revenue, 2),
revenue_lag_3 = lag(revenue, 3),
across(
contains("revenue"),
~replace_na(., 0)
)
)
我已经有一种方法可以帮助我动态地执行上述步骤,这样我就可以在函数中指定 om 滞后数和滞后变量。然而,下一步,我只设法显式实现(通过显式映射每一列):
test_lagged %>%
mutate(
any_previous_zero_revenue = case_when(
revenue_lag_1 == 0 |
revenue_lag_2 == 0 |
revenue_lag_3 == 0 ~ TRUE,
TRUE ~ FALSE
)
)
我想要的是能够通过使用诸如“any_of”、“all_of”、contains()、starts_with() 或类似的。
首先,我想说的是,对于所有 contains/starts 带有“revenue_”的列,检查“any_of”这些变量(对于给定行)是否 == 0。这样我可以根据需要动态创建任意数量的滞后变量,而无需更改 case_when 函数。
这里有一个解决方案
library(tidyverse)
test_lagged %>%
mutate(
any_previous_zero_revenue = if_else(if_any(.cols = starts_with("revenue_lag"),`==`,0),TRUE,FALSE)
)
# A tibble: 4 x 7
id name revenue revenue_lag_1 revenue_lag_2 revenue_lag_3 any_previous_zero_revenue
<int> <chr> <dbl> <dbl> <dbl> <dbl> <lgl>
1 1 a 100 0 0 0 TRUE
2 2 b 200 100 0 0 TRUE
3 3 c 300 200 100 0 TRUE
4 4 d 400 300 200 100 FALSE
使用rowSums
-
library(dplyr)
test_lagged %>%
mutate(previous_zero = rowSums(select(., starts_with('revenue_lag')) == 0) > 0)
# id name revenue revenue_lag_1 revenue_lag_2 revenue_lag_3 previous_zero
# <int> <chr> <dbl> <dbl> <dbl> <dbl> <lgl>
#1 1 a 100 0 0 0 TRUE
#2 2 b 200 100 0 0 TRUE
#3 3 c 300 200 100 0 TRUE
#4 4 d 400 300 200 100 FALSE
我有以下数据:
test <- tibble(id = 1:4, name = letters[1:4], revenue = seq(100, 400, 100))
据此,我创建了滞后变量:
test_lagged <-
test %>%
mutate(
revenue_lag_1 = lag(revenue, 1),
revenue_lag_2 = lag(revenue, 2),
revenue_lag_3 = lag(revenue, 3),
across(
contains("revenue"),
~replace_na(., 0)
)
)
我已经有一种方法可以帮助我动态地执行上述步骤,这样我就可以在函数中指定 om 滞后数和滞后变量。然而,下一步,我只设法显式实现(通过显式映射每一列):
test_lagged %>%
mutate(
any_previous_zero_revenue = case_when(
revenue_lag_1 == 0 |
revenue_lag_2 == 0 |
revenue_lag_3 == 0 ~ TRUE,
TRUE ~ FALSE
)
)
我想要的是能够通过使用诸如“any_of”、“all_of”、contains()、starts_with() 或类似的。
首先,我想说的是,对于所有 contains/starts 带有“revenue_”的列,检查“any_of”这些变量(对于给定行)是否 == 0。这样我可以根据需要动态创建任意数量的滞后变量,而无需更改 case_when 函数。
这里有一个解决方案
library(tidyverse)
test_lagged %>%
mutate(
any_previous_zero_revenue = if_else(if_any(.cols = starts_with("revenue_lag"),`==`,0),TRUE,FALSE)
)
# A tibble: 4 x 7
id name revenue revenue_lag_1 revenue_lag_2 revenue_lag_3 any_previous_zero_revenue
<int> <chr> <dbl> <dbl> <dbl> <dbl> <lgl>
1 1 a 100 0 0 0 TRUE
2 2 b 200 100 0 0 TRUE
3 3 c 300 200 100 0 TRUE
4 4 d 400 300 200 100 FALSE
使用rowSums
-
library(dplyr)
test_lagged %>%
mutate(previous_zero = rowSums(select(., starts_with('revenue_lag')) == 0) > 0)
# id name revenue revenue_lag_1 revenue_lag_2 revenue_lag_3 previous_zero
# <int> <chr> <dbl> <dbl> <dbl> <dbl> <lgl>
#1 1 a 100 0 0 0 TRUE
#2 2 b 200 100 0 0 TRUE
#3 3 c 300 200 100 0 TRUE
#4 4 d 400 300 200 100 FALSE