我指的是很棒的帖子
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的命令。
任何建议都值得赞赏。
答案 0 :(得分:1)
我认为这个想法是使用...
代替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(v0.2.1)于2019-04-23创建