【问题标题】:Dynamic statements in a case_when functioncase_when 函数中的动态语句
【发布时间】:2021-09-11 21:04:05
【问题描述】:

我有以下数据:

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() 或类似的东西在 case_when 函数中动态应用它。

首先,我想说,对于包含/以“revenue_”开头的所有列,检查这些变量(对于给定行)是否“any_of”== 0。这样我可以动态创建尽可能多的滞后变量我想不必更改 case_when 函数。

【问题讨论】:

    标签: r case contains dplyr


    【解决方案1】:

    这里有一个解决方案

    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
    

    【讨论】:

    • 谢谢,维尼修斯!正是我想要的。我不熟悉“if_any”函数。这使我也使用了我也需要的“if_all”功能。谢谢!
    【解决方案2】:

    使用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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      相关资源
      最近更新 更多