在没有当前行的情况下使用 rollaply
use rollaply without current row
我有一个简单的 data.frame,我想在其中滚动计算一些摘要统计信息。例如,window 的五个观测值(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 相比非常慢。
有没有办法以前者的速度达到后者的结果?
基于排除五个中的第三个数字的解决方案,这是计算的当前行。
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
rollapply
的 width=
参数可以是包含偏移向量的单元素列表。
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
也可以是变量名。
我有一个简单的 data.frame,我想在其中滚动计算一些摘要统计信息。例如,window 的五个观测值(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 相比非常慢。
有没有办法以前者的速度达到后者的结果?
基于排除五个中的第三个数字的解决方案,这是计算的当前行。
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
rollapply
的 width=
参数可以是包含偏移向量的单元素列表。
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
也可以是变量名。