我有一个数据框,其中包含7个变量,我想将滚动规范化窗口应用到。我的数据帧没有NA值,所有变量的长度都相同。
> 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
我想在我的数据框中为每个变量应用一个size = 3的滚动窗口。规范化功能使用以下逻辑:
我知道动物园里的rollapply / r函数,但是我不能理解如何编写关于获取当前值并执行减法和除法然后递增到下一个值的部分。如果你不能说,我不是一个强大的程序员。
我相信它已经在下面的第一个答案中被捕获了,但是当滑动窗口到达列的末尾并且值小于窗口大小时,应该返回NA。
任何帮助破解这一点都将非常感激。
为了清楚起见,这里是我试图用数学实现的逻辑
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
答案 0 :(得分: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)