与dplyr的多个滞后

问题描述 投票:1回答:1

我指的是优秀的帖子

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

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

 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个回答
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创建于2019-04-23(v0.2.1)

© www.soinside.com 2019 - 2024. All rights reserved.