我指的是优秀的帖子
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)的固定数量的滞后。
任何建议表示赞赏。
我认为这个想法是使用...
而不是var
,它将遵循你最接近你的功能的精神。
要做到这一点,它需要将enquo()
更改为enquos()
,我在这里使用crossing
和map2
,但这可能是一种更优雅的方式...
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)