【发布时间】:2018-12-07 06:18:23
【问题描述】:
我有一个名为 features 的数据表,其中包含 nightNo、HR、motion 和 angle 列。我想获得每晚 HR、运动和角度的前 600 点的滚动方差。为此,我提出了以下功能:
features <- data.table(nightNo=c(1,1,1,1,1,1,1,2,2,2,2,2,2,2),
HR=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14),
motion=c(14,13,12,11,10,9,8,7,6,5,4,3,2,1),
angle=c(2,4,6,8,10,12,14,16,18,20,22,24,26,28))
# For the example I'll use a window of 6 instead of 600
window = 6
features[, c("HR_Variance", "motion_Variance", "angle_Variance") :=
list(rollapply(HR, window, var, partial=TRUE, align = "right"),
rollapply(motion, window, var, partial=TRUE, align = "right"),
rollapply(angle, window, var, partial=TRUE, align = "right")), by=nightNo ]
# nightNo HR motion angle HR_Variance motion_Variance angle_Variance
# 1: 1 1 14 2 NA NA NA
# 2: 1 2 13 4 0.500000 0.500000 2.000000
# 3: 1 3 12 6 1.000000 1.000000 4.000000
# 4: 1 4 11 8 1.666667 1.666667 6.666667
# 5: 1 5 10 10 2.500000 2.500000 10.000000
# 6: 1 6 9 12 3.500000 3.500000 14.000000
# 7: 1 7 8 14 3.500000 3.500000 14.000000
# 8: 2 8 7 16 NA NA NA
# 9: 2 9 6 18 0.500000 0.500000 2.000000
# 10: 2 10 5 20 1.000000 1.000000 4.000000
# 11: 2 11 4 22 1.666667 1.666667 6.666667
# 12: 2 12 3 24 2.500000 2.500000 10.000000
# 13: 2 13 2 26 3.500000 3.500000 14.000000
# 14: 2 14 1 28 3.500000 3.500000 14.000000
结果是正确的,但由于我有一个大型数据集,它会永远运行。我还制作了其他类似的功能,这些功能在每晚 600 个窗口上使用 runmeans 和 sapplys,它们在合理的时间内运行,这让我认为 rollapply 或方差函数非常慢。有没有办法让这段代码更高效,可能是通过改变 var 或 rollapply 函数?
【问题讨论】:
-
可以使用
RcppRoll::roll_var,也可以查看github.com/Rdatatable/data.table/issues/2778 -
您的预期输出与给定数据不匹配
-
@chinsoon12 遗憾的是,roll_var 还没有实现我需要的部分。
-
@Jimbou 我错过了 6 角,感谢提醒。
-
在调用 roll_var 时,您始终可以在前面附加 NA
标签: r data.table variance rollapply