R中的滚动中位数
Rolling median in R
我需要计算滚动中位数。并有以下代码
i <- 0
median_roll<-c("")
x<-c(1:10)
n<-2
y<-as.data.frame(x)
while(i < length(x)-n){
median_roll[i] <- median(y[i:i+n,])
i <- i + 1
}
在median_roll
中产生以下结果
[1] "3" "4" "5" "6" "7" "8" "9"
我需要的是
[1] "2" "3" "4" "5" "6" "7" "8" "9"
这里有三个选项。
首先是数据。
x <- 1:10
y <- data.frame(x)
n <- 2L
1 基础 R,for
循环。
median_roll <- numeric(length(x) - n)
for(i in seq_along(median_roll)){
median_roll[i] <- median(y[i:(i+n), ])
}
median_roll
#[1] 2 3 4 5 6 7 8 9
2 基础 R,sapply
循环。
sapply(seq_along(median_roll), \(i, n) median(y[i:(i+n), ]), n = 2L)
#[1] 2 3 4 5 6 7 8 9
3 包 zoo
.
zoo::rollapplyr(y$x, width = 3L, FUN = median)
#[1] 2 3 4 5 6 7 8 9
在 R 中,索引以 1
开始,i
应相应地初始化。
i <- 1; x <- 1:10; r <- NULL; n <- 2
while (i - 1 + n < length(x)) {
r[i] <- median(x[i:(i + n)])
i <- i + 1
}
r
# [1] 2 3 4 5 6 7 8 9
您还可以使用 repeat
循环,这可能更具可读性。
i <- 1; x <- 1:10; r <- NULL; n <- 2
repeat {
r[i] <- median(x[i:(i + n)])
i <- i + 1
if (i - 1 + n == length(x))
break
}
r
# [1] 2 3 4 5 6 7 8 9
一个sapply(Map())
解决方案。
x <- 1:10; n <- 2
sapply(Map(`+`, list(1:(n + 1L)), seq(0, length(x) - n - 1L, n - 1L)),
\(s) median(x[s]))
# [1] 2 3 4 5 6 7 8 9
我需要计算滚动中位数。并有以下代码
i <- 0
median_roll<-c("")
x<-c(1:10)
n<-2
y<-as.data.frame(x)
while(i < length(x)-n){
median_roll[i] <- median(y[i:i+n,])
i <- i + 1
}
在median_roll
中产生以下结果[1] "3" "4" "5" "6" "7" "8" "9"
我需要的是
[1] "2" "3" "4" "5" "6" "7" "8" "9"
这里有三个选项。
首先是数据。
x <- 1:10
y <- data.frame(x)
n <- 2L
1 基础 R,for
循环。
median_roll <- numeric(length(x) - n)
for(i in seq_along(median_roll)){
median_roll[i] <- median(y[i:(i+n), ])
}
median_roll
#[1] 2 3 4 5 6 7 8 9
2 基础 R,sapply
循环。
sapply(seq_along(median_roll), \(i, n) median(y[i:(i+n), ]), n = 2L)
#[1] 2 3 4 5 6 7 8 9
3 包 zoo
.
zoo::rollapplyr(y$x, width = 3L, FUN = median)
#[1] 2 3 4 5 6 7 8 9
在 R 中,索引以 1
开始,i
应相应地初始化。
i <- 1; x <- 1:10; r <- NULL; n <- 2
while (i - 1 + n < length(x)) {
r[i] <- median(x[i:(i + n)])
i <- i + 1
}
r
# [1] 2 3 4 5 6 7 8 9
您还可以使用 repeat
循环,这可能更具可读性。
i <- 1; x <- 1:10; r <- NULL; n <- 2
repeat {
r[i] <- median(x[i:(i + n)])
i <- i + 1
if (i - 1 + n == length(x))
break
}
r
# [1] 2 3 4 5 6 7 8 9
一个sapply(Map())
解决方案。
x <- 1:10; n <- 2
sapply(Map(`+`, list(1:(n + 1L)), seq(0, length(x) - n - 1L, n - 1L)),
\(s) median(x[s]))
# [1] 2 3 4 5 6 7 8 9