2013-04-11 14 views
2

滑動窗口我有以下所示的數據幀DF,有兩列A和B:中的R

A     B     
1     0    
3     0    
4     0     
2     1      
6     0      
4     1      
7     1     
8     1      
1     0 

的滑動窗口方法如下所示進行。對於列3,在滑動窗口大小爲3的情況下,使用以下公式計算平均值B:B(寬度= 3,寬度= 1)。每個窗口的平均值顯示在左側。現在

A:         1    3    4    2    6    4    7    8    1             
    B:        0    0    0    1    0    1    1    1    0         
       [0    0    0]                                             0 
        [0    0    1]             0.33 
          [0    1    0]                        0.33 
           [1    0    1]                         0.66 
             [0    1    1]             0.66 
              [1    1    1]           1 
               [1    1    0]           0.66 
output:       0   0.33 0.33 0.66  0.66 1  1 1 0.66 

,對於每一行/列座標,含有該座標被認爲是和應當保留的最高平均值其給出如圖列「輸出」的結果的所有窗口。

我需要獲得如上所示的輸出。輸出應該是這樣的:

A     B     Output 
1     0      0 
3     0      0.33 
4     0      0.33 
2     1      0.66 
6     0      0.66 
4     1      1 
7     1      1 
8     1      1 
1     0     0.66 

R的任何幫助?

+0

(1)現在我明白了這個問題。讓我試着看看我能否弄清楚什麼。還有一件事。我認爲你在這個編輯中失去了最終輸出「mean_A」。你可以添加它嗎?謝謝。 – Arun 2013-04-11 11:09:29

+0

@Arun現在我已經添加了Mean_A。 – chas 2013-04-11 11:27:44

+0

是'A'總是一個序列1:N?我不明白'A'中的值對你的計算很重要。根據我的理解,它幾乎是'rollmax(rollmean(B,3),3)'。 – 2013-04-11 11:39:36

回答

4

試試這個:

# form input data 
library(zoo) 
B <- c(0, 0, 0, 1, 0, 1, 1, 1, 0) 

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

最後一行返回:

[1] 0.0000000 0.3333333 0.3333333 0.6666667 0.6666667 1.0000000 1.0000000 
[8] 1.0000000 0.6666667 

如果有你可能想試試這個NA值:

k <- 3 
B <- c(1, 0, 1, 0, NA, 1) 
rollapply(B, 2*k-1, function(x) max(rollapply(x, k, mean, na.rm = TRUE)), partial = TRUE) 

其中最後行給出了這個:

[1] 0.6666667 0.6666667 0.6666667 0.5000000 0.5000000 0.5000000 

擴大它這些構成爲:

c(mean(B[1:3], na.rm = TRUE), ## 
max(mean(B[1:3], na.rm = TRUE), mean(B[2:4], na.rm = TRUE)), ## 
max(mean(B[1:3], na.rm = TRUE), mean(B[2:4], na.rm = TRUE), mean(B[3:5], na.rm = TRUE)), 
max(mean(B[2:4], na.rm = TRUE), mean(B[3:5], na.rm = TRUE), mean(B[4:6], na.rm = TRUE)), 
max(mean(B[3:5], na.rm = TRUE), mean(B[4:6], na.rm = TRUE)), ## 
mean(B[4:6], na.rm = TRUE)) ## 

如果你不想在每端(標有上述##)下降partial = TRUEk-1組件。

+0

那裏 - 我知道有人會制定我的正確評論以上:-) – 2013-04-11 15:10:30

+0

@ G.Grothendieck謝謝。rollapply函數中的5是什麼? – chas 2013-04-11 16:12:34

+0

@ G.Grothendieck基於什麼近似值將寬度設置爲5?這只是一個示例數據。真實數據的窗口大小爲5000,滑動爲1.在這種情況下,我們將如何確定窗口的寬度? – chas 2013-04-11 16:34:58