我怎样才能使用rollapply和scale

时间:2014-06-16 15:30:33

标签: r scale apply

我有一个可以像这样生成的数据:

set.seed(1)
foo <- sample(1:10000,1000)
foo[c(1:100)] <- 1

在此之后得到zvalues,它是按比例计算的,我使用了:

boo<-rollapply(foo,50,scale)

但是所有boo的值似乎都是NAN。

背景信息:

z-score = scale = (x - mean)/ std deviation

我的第一个问题是为什么我获得所有值的NAN?对于前100个,我理解std dev是o。所以,我应该只为前几行获得Nan,但是我获得所有行的NAN。我不明白我错在哪里。

第二个问题是我的实际问题。

我想要一个包含50个元素的窗口,只获得窗口的第25个或中间元素的z分数。然后我需要对所有1000个数据点进行rollapply。

因此,对于其各自的50个窗口大小,输出将是从25到975的元素的z得分。如何使用rollapply和scale获得此结果?

1 个答案:

答案 0 :(得分:2)

1) rollapply期望FUN返回标量或向量,而不是列矩阵。返回向量将消除不需要的NaN值:

rollapply(foo , 50, function(x) c(scale(x)))

结果将是951x50矩阵。

2)对于第二个问题,请尝试:

rollapply(foo, 50, function(x) (x[25] - mean(x)) / sd(x))

或者这个:

rollapply(foo, 50, function(x) scale(x)[25])

或者这个:

rollapply(foo, 50, function(x) c(scale(x)))[, 25]