修改 dplyr::lag 函数

Modifying dplyr::lag function

我正在尝试使用 dplyr 包中的 lag 函数。但是,当我给出滞后 > 0 时,我希望将缺失值替换为 x 中的第一个值。我们怎样才能做到这一点

library(dplyr)
x<-c(1,2,3,4)
z<-lag(x,2)
z
## [1] NA NA  1  2

这是一个修改后的函数 mylag:

mylag <- function(x, k = 1, ...)
  replace(lag(x, k, ...), seq(k), x[1])

x <- 1:4
mylag(x, k = 2)
# [1] 1 1 1 2

由于您使用的是 lag 函数 dplyr,因此存在参数 default。因此,您可以指定希望 x[1] 成为 default

lag(x, 2, default=x[1])

我可以建议调整函数,使其以两种方式工作:滞后和超前(正滞后和负滞后)。

shift = function(x, lag, fill=FALSE) {
  require(dplyr)
  switch(sign(lag)/2+1.5, 
         lead( x, n=abs(lag), default=switch(fill+1, NA, tail(x, 1))  ), 
         lag(  x, n=abs(lag), default=switch(fill+1, NA, head(x, 1))  )
  )
}

它有一个 "fill" 参数,根据滞后符号自动填充最后一个值的第一个。

> shift(1:10, -1)
#### [1]  2  3  4  5  6  7  8  9 10 NA
> shift(1:10, +1, fill=TRUE)
#### [1] 1 1 2 3 4 5 6 7 8 9