使用ave()计算滚动标准偏差

时间:2014-07-30 20:59:15

标签: r

假设我有三列和一个值:

col1   col2   col3   val
  a     1       a     10
  a     1       a      3
  a     1       a      2
  a     1       a      4
  a     1       a      6
  b     1       a     20
  b     1       a     30
  b     5       a     100
  b     5       a     200
  b     5       a     100
  b     5       a     250
  b     5       a     180

数据都已正确排序。我需要为每个不同的组在给定窗口n上添加滚动标准偏差。这会产生:

n = 3
col1   col2   col3   val   sd
  a     1       a     10   4.3
  a     1       a      3   1
  a     1       a      2   2
  a     1       a      4   NULL
  a     1       a      6   NULL
  b     1       a     20   NULL
  b     1       a     30   NULL
  b     5       a     100  57.7
  b     5       a     120  76.3
  b     5       a     200  70
  b     5       a     100  NULL
  b     5       a     250  NULL

注意:这些只是标准偏差,我没有做实际的计算。

我尝试使用类似的东西:

ave(tt$val, tt[, 1:3], FUN=function(x) rollapply(x, width = 3, align = 'left', FUN = sd))

这不起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

对于data.table

来说,这看起来很完美
library(data.table)
library(zoo)
setDT(tt)[, sd := rollapply(val, width = 3, align = 'left', FUN = sd, fill = NA), by = list(col1, col2, col3)]
tt
    col1 col2 col3 val        sd
 1:    a    1    a  10  4.358899
 2:    a    1    a   3  1.000000
 3:    a    1    a   2  2.000000
 4:    a    1    a   4        NA
 5:    a    1    a   6        NA
 6:    b    1    a  20        NA
 7:    b    1    a  30        NA
 8:    b    5    a 100 57.735027
 9:    b    5    a 200 76.376262
10:    b    5    a 100 75.055535
11:    b    5    a 250        NA
12:    b    5    a 180        NA