1

我有一个包含 A 列和 B 列的数据框,如下所示。我想计算滑动窗口中 B 列中值的平均值。滑动窗口大小不是恒定的,应根据 A 列设置。即窗口大小在 A 列中设置为 200 的值限制。下面的示例对窗口大小进行了清晰的描述:

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

在 R 中的滑动窗口有一个类似的问题和

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

给出以 k 为窗口大小的解. 不同之处在于窗口大小在当前问题中不是恒定的。

有人可以在 R 中提供任何解决方案吗?

4

3 回答 3

1

可重现形式的数据:

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

只需使用vapplysapply循环 的值A,并计算 的适当子集的平均值B

data$Output <- with(
  data,
  vapply(
    A, 
    function(x) 
    {
      index <- x <= A & A <= x + window_size
      mean(B[index])
    },
    numeric(1)
  )
)
于 2013-10-18T14:51:18.017 回答
0

这似乎有效:

#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
于 2013-10-18T16:31:59.507 回答
0

尝试这个:

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)
}
于 2013-10-18T14:46:39.093 回答