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

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 に答える