【问题标题】:Multiple Lags with dplyrdplyr 的多个滞后
【发布时间】:2019-04-23 13:22:47
【问题描述】:

我参考了优秀的帖子

https://purrple.cat/blog/2018/03/02/multiple-lags-with-tidy-evaluation/

我想要做的是创建一个功能,à la dplyr,以 生成新列,这些列是现有列的滞后版本 一个数据框。 例如,您可以手动执行此操作

 library(dplyr)
 library(rlang)

 d2 <- tibble(x1 =1:10, x2=10:19,  x3=50:59)

 d3 <- d2%>%mutate(x1lag1=lag(x1, 1), x1lag2=lag(x1,2))

但是当您需要延迟几次时,这会很快变得乏味 不同的列。 上面链接中的一种解决方案如下

lags <- function(var, n=10){
 var <- enquo(var)

  indices <- seq_len(n)
  map( indices, ~quo(lag(!!var, !!.x)) ) %>%
   set_names(sprintf("lag_%s_%02d", quo_text(var), indices))

 }


d4 <- d2 %>%
  mutate( !!!lags(x1, 3), !!!lags(x2,3) )

有人知道如何将其变得更通用吗?我的意思是我 想要获取列列表的固定数量的滞后(x1 和 x2,例如),只需传递列列表,而无需 重复 x1 和 x2 的命令。

欢迎提出任何建议。

【问题讨论】:

    标签: r dplyr rlang


    【解决方案1】:

    我认为这个想法是使用... 而不是var,这将最接近您的功能精神。

    为此,需要将enquo() 更改为enquos(),我在这里使用crossingmap2,但可能有更优雅的方式来做到这一点...

    library(tidyverse)
    library(rlang)
    #> 
    #> Attaching package: 'rlang'
    #> The following objects are masked from 'package:purrr':
    #> 
    #>     %@%, as_function, flatten, flatten_chr, flatten_dbl,
    #>     flatten_int, flatten_lgl, flatten_raw, invoke, list_along,
    #>     modify, prepend, splice
    
    d <- data_frame(x = seq_len(100),
                    y = rnorm(100))
    #> Warning: `data_frame()` is deprecated, use `tibble()`.
    #> This warning is displayed once per session.
    
    multijetlag <- function(data, ..., n=10){
      variable <- enquos(...)
    
      indices <- seq_len(n)
      combos <- crossing(indices, var =as.list(variable))
    
      quosures <- map2(combos$indices, combos$var,
                       ~quo(lag(!!.y, !!.x)) ) %>% 
        set_names(paste("lag", combos$indices, map_chr(combos$var, quo_text), sep = "_"))
      mutate( data, !!!quosures )
    
    }
    
    multijetlag(d, x, y, n=3)
    #> # A tibble: 100 x 8
    #>        x       y lag_1_x  lag_1_y lag_2_x  lag_2_y lag_3_x lag_3_y
    #>    <int>   <dbl>   <int>    <dbl>   <int>    <dbl>   <int>   <dbl>
    #>  1     1  0.213       NA  NA           NA  NA           NA  NA    
    #>  2     2  0.277        1   0.213       NA  NA           NA  NA    
    #>  3     3 -0.517        2   0.277        1   0.213       NA  NA    
    #>  4     4 -0.671        3  -0.517        2   0.277        1   0.213
    #>  5     5 -1.12         4  -0.671        3  -0.517        2   0.277
    #>  6     6 -0.296        5  -1.12         4  -0.671        3  -0.517
    #>  7     7 -1.18         6  -0.296        5  -1.12         4  -0.671
    #>  8     8  0.0582       7  -1.18         6  -0.296        5  -1.12 
    #>  9     9 -0.455        8   0.0582       7  -1.18         6  -0.296
    #> 10    10 -0.969        9  -0.455        8   0.0582       7  -1.18 
    #> # … with 90 more rows
    

    reprex package (v0.2.1) 于 2019 年 4 月 23 日创建

    【讨论】:

      猜你喜欢
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多