修改 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
我正在尝试使用 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