скользящее окно в R для разных размеров окна

У меня есть фрейм данных со столбцами A и B, как показано ниже. Я хотел бы рассчитать среднее значение значений в столбце B в скользящем окне. Размер скользящего окна не является постоянным и должен устанавливаться на основе столбца A. т. е. размер окна устанавливается для предельного значения 200 в столбце A. В приведенном ниже примере дается четкое описание размера окна:

A:        10   150    200   220    300    350    400    410    500                                          
B:         0     0      0     1     0      1     1      1       0               mean                 
          [0     0    0]                                                        0
                 [0     0     1     0      1]                                   0.4
                        [0    1     0      1      1]                            0.6
                              [1    0      1      1     1]                      0.8
                                    [0     1     1      1      0]               0.6
                                           [1     1      1     0]               0.75
                                                  [1     1     0]               0.66
                                                        [1     0]               0.5
                                                               [0]              0


 Output:      0    0.4    0.6  0.8   0.8    0.8    0.8   0.8  0.75 

Теперь для каждой строки/координаты в столбце A учитываются все окна, содержащие эту координату, и они должны сохранять наибольшее среднее значение, которое дает результаты, показанные в столбце «вывод».

Я хочу иметь вывод, как показано выше. Вывод должен выглядеть так:

A                    B                  Output   
10                   0                      0  
150                  0                      0.4
200                  0                      0.6
220                  1                      0.8
300                  0                      0.8
350                  1                      0.8
400                  1                      0.8
410                  1                      0.8
500                  0                      0.75

есть аналогичный вопрос в Sliding window in R и

rollapply(B, 2*k-1, function(x) max(rollmean(x, k)), partial = TRUE)

дает решение с k в качестве размера окна. Разница заключается в размере окна, которое не является постоянным в текущем вопросе.

Может ли кто-нибудь предоставить какое-либо решение в R?


person chas    schedule 18.10.2013    source источник
comment
На самом деле не очевидно, как значения A определяют, какие значения B вы хотите взять в среднем. Например, первое значение A равно 10, но вы вычисляете среднее из 3 значений. Укажите переменную, которую мы можем использовать (возможно, созданную с помощью dput(your_data)).   -  person Richie Cotton    schedule 18.10.2013
comment
Предел окна составляет 200 в столбце A. Поскольку 3-е значение в столбце A достигает 200, значения в этом окне являются первыми 3 значениями в B, т.е. [0 0 0]. Если мы сдвинемся сейчас на одну позицию до 150, теперь размер окна будет таким, пока значение в A не достигнет 150+200=350. поэтому значения во втором окне [0 0 1 0 1]. Аналогичным образом выбираются размер окна и значения в окнах.   -  person chas    schedule 18.10.2013


Ответы (3)


Данные в воспроизводимой форме:

data <- data.frame(
  A = c(10, 150, 200, 220, 300, 350, 400, 410, 500) , 
  B = c(0, 0, 0, 1, 0, 1, 1, 1, 0)  
)

window_size <- 200

Просто используйте vapply или sapply, чтобы перебрать значения A и вычислить среднее значение соответствующего подмножества B.

data$Output <- with(
  data,
  vapply(
    A, 
    function(x) 
    {
      index <- x <= A & A <= x + window_size
      mean(B[index])
    },
    numeric(1)
  )
)
person Richie Cotton    schedule 18.10.2013

Попробуй это:

a=c(10,150,200,250,300,350,400)
b=c(0,0,0,1,1,1,0)

mean=rep(0,length(a))
window=200
for(i in 1:length(a)){
    vals=which(a>=a[i] & a<=a[i]+window)
    mean[i]=sum(b[vals])/length(vals)
}
person Peter Dutton    schedule 18.10.2013

Кажется, это работает:

#data
DF <- data.frame(A = c(10, 150, 200, 220, 300, 350, 400, 410, 500),
                 B = c(0, 0, 0, 1, 0, 1, 1, 1, 0))

#size of the different windows
rolls <- findInterval(DF$A + 200, DF$A)

#find the mean for every interval
fun <- function(from, to) { mean(DF$B[from:to]) } 
means <- mapply(fun, 1:nrow(DF), rolls)

#in which windows is every value of DF$A
fun2 <- function(x, from, to) { x %in% from:to } 

output <- rep(NA, nrow(DF))
for(i in 1:nrow(DF))
 {
  output[i] <- max(means[mapply(fun2, i, 1:nrow(DF), rolls)])
 }

DF$output <- output

>  DF
    A B output
1  10 0   0.00
2 150 0   0.40
3 200 0   0.60
4 220 1   0.80
5 300 0   0.80
6 350 1   0.80
7 400 1   0.80
8 410 1   0.80
9 500 0   0.75
person alexis_laz    schedule 18.10.2013