2017-07-15 170 views
1

我有一個數據框有7個變量,我想應用一個滾動標準化窗口。我的數據幀沒有NA值,所有變量的長度都是相同的。R中的滑動標準化窗口

> head(CK0159U09A3,10) 
      W1   W2   W3  W4   W5   W6   W7 
1 1.37853716 0.01316304 -0.1363012 0.6895341 -0.7230930 -0.1310321 -0.4109521 
2 -0.73032998 0.31212925 0.1654731 0.9187255 -0.8017260 -0.1619631 -0.4243575 
3 -0.52130420 0.43831484 0.6088623 1.1183964 -0.8486971 -0.1970389 -0.4368820 
4 0.55501096 0.13850401 1.1221211 1.2708212 -0.8701385 -0.2372061 -0.4490060 
5 -0.06995122 -0.53842548 1.4592013 1.3581935 -0.8661200 -0.2791726 -0.4608654 
6 -0.19984548 -0.78829431 1.4564180 1.3823090 -0.8431200 -0.3184653 -0.4722506 
7 0.68935525 0.18733222 1.0158497 1.3344059 -0.8043461 -0.3526886 -0.4825229 
8 -0.49540738 0.80663376 0.1774945 1.1800970 -0.7494087 -0.3803636 -0.4901212 
9 -0.09501622 -0.17931684 -0.7074083 0.9312984 -0.6801124 -0.4008524 -0.4942994 
10 -0.14939548 -0.68153738 -1.2723772 0.6054420 -0.5968207 -0.4149125 -0.4952316 

我的窗口被定義爲大小3

windowSize <- 3 

我想我的數據幀中的尺寸= 3的滾動窗口應用到每個變量。歸一化函數使用下列邏輯:

  1. 計算整個變量的標準偏差(長度(CK0159U09A3 [1] .....)
  2. 然後尺寸= 3的窗口適用於第一3值並計算它們的平均值
  3. 對於窗口中的第一個值,它將三個值的平均值相減,然後除以標準偏差
  4. 該函數然後遞增1並對接下來的三個值執行相同的步驟全部7列

我知道動物園中的rollapply/r函數,但我無法理解如何編寫關於獲取當前值並執行減法和除法,然後遞增到下一個值的部分。如果你不能說出來,我不是一個強大的程序員。

我相信它已經在下面的第一個答案中被捕獲了,但是當滑動窗口到達列的末尾並且值小於窗口大小時,應該返回NAs。

任何幫助開裂這將不勝感激。

只是爲了清楚起見,這裏是我試圖用數學來實現邏輯

1.3785 - ((1.378+(-0.7303)+(-0.5213)/windowSize))/S.D of column 

-0.7303 - ((-0.7303+(-0.5213)+0.555)/windowSize))/S.D of column 

-0.5213 - ((-0.5213+0.555+(-0.0699))/windowSize))/S.D of column 
+1

爲上下兩排,會發生什麼,那裏有沒有尾隨2倍的值?如果您給出*期望的輸出*,這將有所幫助;也許是手動計算前幾行,以便我們有一些事情需要驗證。 – r2evans

+0

@ r2evans,你發現了,我從來沒有說過,如果值小於窗口的大小,會發生什麼。我已經更新了原來的帖子,說明應該退還新來港定居人士。感謝您的高舉。 – TheGoat

回答

3

1)如果DF是輸入data.frame,計算滾動裝置,減去那些從原始數據幀然後將每列除以相應的sd值。如果您不想使用NA行,請使用na.omit(out)

注意的是,這個問題的答案與此有關:How to divide each row of a matrix by elements of a vector in R

library(zoo) 

out <- t(t(DF - rollmean(DF, 3, fill = NA, align = "left"))/sapply(DF, sd)) 

,並提供:

> out 
      W1   W2   W3   W4   W5  W6  W7 
1 2.0571604 -0.46799047 -0.3798546 -0.782516058 0.7559711 0.3162800 0.4320913 
2 -0.7668684 0.03065979 -0.5079677 -0.656126126 0.4270853 0.3599383 0.4083388 
3 -0.7839578 0.82502267 -0.4947466 -0.466405606 0.1438538 0.3990324 0.3966334 
4 0.7080855 1.03647378 -0.2435920 -0.236471919 -0.1148815 0.4020498 0.3856112 
5 -0.3229973 -0.30756238 0.1618686 -0.000389918 -0.3137854 0.3680621 0.3629682 
6 -0.3046393 -1.66132459 0.6238737 0.297421141 -0.4903858 0.3136170 0.3091448 
7 1.0105062 -0.16328686 0.9294159 0.662844512 -0.6631908 0.2474401 0.2128288 
8 -0.3830338 1.59900097 0.8471133 0.979199212 -0.8212911 0.1795721 0.1020336 
9   NA   NA   NA   NA   NA  NA  NA 
10   NA   NA   NA   NA   NA  NA  NA 

的問題修正公式在第1列第3倍的值是:

(1.3785 - (1.378+(-0.7303)+(-0.5213))/3)/sd(DF[, 1]) 
## [1] 2.057361 
(-0.7303 - (-0.7303+(-0.5213)+0.555)/3)/sd(DF[, 1]) 
## -0.7668342 
(-0.5213 - (-0.5213+0.555+(-0.0699))/3)/sd(DF[, 1]) 
## [1] -0.7839742 

2)另一種解決方案是定義一個函數,該函數在單個列上執行所需的操作,然後在每個列上執行所需的操作sapply

sapply(DF, function(x) (x - rollmean(x, 3, align = "left", fill = NA))/sd(x)) 

注:在重現的形式輸入:

Lines <- " W1   W2   W3  W4   W5   W6   W7 
1 1.37853716 0.01316304 -0.1363012 0.6895341 -0.7230930 -0.1310321 -0.4109521 
2 -0.73032998 0.31212925 0.1654731 0.9187255 -0.8017260 -0.1619631 -0.4243575 
3 -0.52130420 0.43831484 0.6088623 1.1183964 -0.8486971 -0.1970389 -0.4368820 
4 0.55501096 0.13850401 1.1221211 1.2708212 -0.8701385 -0.2372061 -0.4490060 
5 -0.06995122 -0.53842548 1.4592013 1.3581935 -0.8661200 -0.2791726 -0.4608654 
6 -0.19984548 -0.78829431 1.4564180 1.3823090 -0.8431200 -0.3184653 -0.4722506 
7 0.68935525 0.18733222 1.0158497 1.3344059 -0.8043461 -0.3526886 -0.4825229 
8 -0.49540738 0.80663376 0.1774945 1.1800970 -0.7494087 -0.3803636 -0.4901212 
9 -0.09501622 -0.17931684 -0.7074083 0.9312984 -0.6801124 -0.4008524 -0.4942994 
10 -0.14939548 -0.68153738 -1.2723772 0.6054420 -0.5968207 -0.4149125 -0.4952316" 
DF <- read.table(text = Lines) 
+0

非常感謝您的快速回復,這是一個巨大的幫助。 – TheGoat