假设我有三列和一个值:
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))
这不起作用。有什么想法吗?
答案 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