双滑动窗

时间:2016-02-03 18:34:36

标签: r window double

我想在for循环中创建一个双滑动窗口。示例数据集可能如下所示:

    a <- structure(list(a = c(0.0961136, 0.1028192, 0.1106424, 0.1106424, 
0.117348, 0.117348, 0.117348, 0.122936, 0.1307592, 0.1307592, 
0.1318768, 0.1318768, 0.1385824, 0.1385824, 0.1318768, 0.1251712, 
0.1251712, 0.1251712, 0.1251712, 0.1251712)), .Names = "a", row.names = c(NA, 
-20L), class = "data.frame")

到目前为止我的代码看起来像这样:

windowSize <- 5
windowStep <- 1
dat <- list()
for (i in seq(from = 1, to = nrow(a), by = windowStep)){
  window1 <- a[i:windowSize, ]
  window2 <- a[i:windowSize + windowSize, ]
  if (median(window1) <= 0.12 && (median(window1) >= 0.08)) {
    p <- "True"
 } else 
    p <- "not"

  dat[[i]] <- c(p)
}  
result <- as.data.frame(do.call(rbind, dat)) 

此示例显示我需要两个大小为5的窗口(数据点)一次在另一个前面滑动1个数据点。这个例子不使用窗口2,因为它不起作用!(我最终需要它才能工作)但是只使用window1来计算每个步骤的中位数(在这种情况下),但是输出不正确。 if语句要求如果窗口1的中位数介于0.08和0.12之间,则输出“True”,否则为“not”。

for for loop =

的输出
1  True
2  True
3  True
4  True
5  True
6  True
7  True
8  True
9  True
10  not
11  not
12  not
13  not
14  not
15  not
16  not
17  not
18  not
19  not
20  not

使用rollapply检查输出是否正确(显然可以通过眼睛看到)

rollapply(a, 5, FUN = median, by = 1, by.column = TRUE, partial = TRUE, align = c("left"))

应该是:

1  True
2  True
3  True
4  not
5  not
6  not
7  not
8  not
9  not
10 not
11 not
12 not
13 not
14 not
15 not
16 not
17 not
18 not
19 not
20 not

如果可能的话,解决方案是否仍然可以作为for循环使用,因为我还需要添加更多内容,但需要先将其设置为正确。感谢。

1 个答案:

答案 0 :(得分:0)

这很接近..修改自:https://stats.stackexchange.com/questions/3051/mean-of-a-sliding-window-in-r

windowSize <- 10
windowStep <- 1
Threshold <- 0.12
a <- as.vector(a)
data <- a

slideFunct <- function(data, windowSize, WindowStep){
  total <- length(data)
  dataLength <- seq(from=1, to=(total-windowSize), by=windowStep)
  result <- vector(length = length(dataLength))
  for(i in 1:length(dataLength)){
    result[i] <- if (median(data[dataLength[i]:(dataLength[i]+windowSize)]) <= Threshold)
      result[i] <- "True"
    else
      result[i] <- "not"
  }
  return(result)
}