在没有当前行的情况下使用rollaply

时间:2017-12-07 16:34:35

标签: r dataframe dplyr apply rollapply

我有一个简单的data.frame,我想在滚动的基础上计算一些摘要统计信息。例如,通过五个观测窗口(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相比非常慢。

有没有办法用前者的速度来实现后者的结果?

2 个答案:

答案 0 :(得分:2)

width=的{​​{1}}参数可以是包含偏移向量的单个元素列表。

rollapply

请注意,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也可以是变量名。

答案 1 :(得分: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