2016-02-03 1 views
0

Я хочу создать двойное скользящее окно в петле для петли. Набор примеров данных может выглядеть следующим образом:Двойное раздвижное окно

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, потому что он не работает! (Мне нужно, чтобы он работал в конечном итоге). Однако использование только окна1 для вычисления медианы (в данном случае) на каждом шаге работает, но выход неверен. Операторы if утверждают, что если медиана окна 1 находится между 0.08 и 0.12, тогда выведите «True» еще «нет».

Выход для моего цикл =

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 

Могли решение остается как цикл цикла, если это возможно, поскольку у меня есть гораздо больше, чтобы добавить, но сначала нужно получить это право. Благодарю.

+1

Может быть, это может помочь вам: http://stackoverflow.com/questions/35039361/summing-the-counts-in-a-data-frame -using-slide-window/35040537 # 35040537 – Jaap

+0

Спасибо, но в идеале я хочу сохранить его как цикл for, потому что в конечном итоге я хотел бы добавить дополнительные критерии для окон. – PharmR

+1

hint: 'i' переходит от' 1' к 'nrow (a)', ваш оператор подмножества переходит из 'i' в' windowSize'. Что происходит, когда 'i> windowSize'? – Vlo

ответ

0

Это получает close..modified от: 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) 
}