dplyr造成多个延迟

时间:2019-04-23 13:22:48

标签: r dplyr rlang

我指的是很棒的帖子

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

我想做的是创建一个功能,如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的命令。

任何建议都值得赞赏。

1 个答案:

答案 0 :(得分: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-04-23创建