【问题标题】:use rollaply without current row在没有当前行的情况下使用 rollaply
【发布时间】:2018-05-21 19:54:45
【问题描述】:

我有一个简单的 data.frame,我想在其中滚动计算一些汇总统计信息。例如,一个包含五个观测值(2 个滞后,当前一个和 2 个提前)的窗口上的滚动中位数是通过

library(dplyr)
x <- data.frame("vals" = rnorm(3e04))
y <- x %>%
         mutate(med5 = rollapply(data = vals, 
                width = 5, 
                FUN = median, 
                align = "center", 
                fill = NA, 
                na.rm = TRUE))

但是,我想从该计算中排除当前行。我找到了以下方法:

z <- x %>% 
      mutate(N=1:n()) %>% 
      do(data.frame(., prmed = sapply(.$N, function(i) median(.$vals[.$N %in% c((i - 2):(i - 1), (i + 1):(i + 2))]))))

如果我随后将前两个值设置为 NA,这就是我想要的。

到目前为止一切顺利,唯一的问题是后一种方法与 rollapply 相比非常慢。

有没有办法以前者的速度达到后者的结果?

【问题讨论】:

    标签: r dataframe dplyr apply rollapply


    【解决方案1】:

    基于排除五个中的第三个数字的解决方案,即计算的当前行。

    library(dplyr)
    library(zoo)
    
    set.seed(124)
    
    x <- data.frame("vals" = rnorm(3e04))
    y <- x %>%
      mutate(med5 = rollapply(data = vals, 
                              width = 5, 
                              FUN = function(x) median(x[-3], na.rm = TRUE), 
                              align = "center", 
                              fill = NA))
    
    head(y)
    #          vals      med5
    # 1 -1.38507062        NA
    # 2  0.03832318        NA
    # 3 -0.76303016 0.1253147
    # 4  0.21230614 0.3914015
    # 5  1.42553797 0.4562678
    # 6  0.74447982 0.4562678
    

    【讨论】:

    • 像魅力一样工作,谢谢!优雅、直接且易于推广到中位数以外的函数。
    【解决方案2】:

    rollapplywidth= 参数可以是包含偏移向量的单元素列表。

    y <- x %>%
      mutate(med5 = rollapply(data = vals, 
                              width = list(c(-2, -1, 1, 2)),
                              FUN = median,
                              na.rm = TRUE,
                              fill = NA))
    

    请注意,align = "center" 是默认值,因此不必指定。此外,如果我们使用偏移量,那么 align= 将被忽略。为安全起见,TRUE 应完整写出,因为T 也可以是变量名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 2012-07-17
      • 2020-01-01
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多