【问题标题】:Modifying dplyr::lag function修改 dplyr::lag 函数
【发布时间】:2015-02-18 08:35:42
【问题描述】:

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

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

【问题讨论】:

  • 可能是z[is.na(z)] &lt;- x[1]?
  • @DavidArenburg - 是的:&gt; stats::lag(1:10, 2) [1] NA NA 1 2 3 4 5 6 7 8
  • @DavidArenburg 你是对的......所以stats::lag 不是在调用 stats-lag 吗?!
  • @Tim 似乎dplyrs lagthis 中的一些错误似乎相关

标签: r dplyr lag


【解决方案1】:

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

lag(x, 2, default=x[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
    

    【讨论】:

    • 它给了我[1] 1 1 3 4
    • @Pascal 这是因为 Sven 也在使用来自 dplyr 包的 lag。欢迎来到 Hadlywerse...
    【解决方案3】:

    我是否可以建议调整该函数,使其双向工作:滞后和领先(正滞后和负滞后)。

    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))  )
      )
    }
    

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

    > 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
    

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 2019-05-28
      • 2021-11-11
      • 2023-03-16
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      相关资源
      最近更新 更多