如何使用重叠值对data.table进行分组?

时间:2016-08-05 14:17:37

标签: r data.table

我有一个关于R.中data.table的问题 我正在研究加速度数据,这需要我从原始数据生成功能。我想每2秒对数据进行分组。通过生成另外1列来指示每2秒的组和使用by的组是很容易的。 但是,我想要重叠窗口。例如,我的原始数据就是这个

a=data.table(x = c(1:10), y= c(2:11), z = c(5), second=rep(c(1:5),each=2))
  

x y z second

     

1:1 2 5 1

     

2:2 3 5 1

     

3:3 4 5 2

     

4:4 5 5 2

     

5:5 6 5 3

     

6:6 7 5 3

     

7:7 8 5 4

     

8:8 9 5 4

     

9:9 10 5 5

     

10:10 11 5 5

现在,我想每2秒计算x,y,z列的平均值。 1和2,2和3,3和4,4和5。 我可以运行for循环,但因为我有一个庞大的数据集,所以需要很长时间。你知道如何使用数据表工具吗? 非常感谢

2 个答案:

答案 0 :(得分:3)

这是另一种方式:

ag = data.table(
  second = c(1:2, 2:3, 3:4, 4:5), 
  g = rep(paste(1:4, 2:5, sep="-"), each=2)
)

a[ag, on="second"][, mean(unlist(.SD)), by=g, .SDcols=x:z]

#      g       V1
# 1: 1-2 3.666667
# 2: 2-3 5.000000
# 3: 3-4 6.333333
# 4: 4-5 7.666667

我确定你可以手动减少ag,但我不清楚它背后的规则是什么。

通常,如果您要跨列计算 ,那么您的数据格式不正确。如果你有时间,我建议你阅读making data "tidy"

答案 1 :(得分:1)

由于第二个'只有2个独特的观察结果,我们会得到' x',' y'的lead,&# 39; Z'列,按' second',unlist Dataset的子集分组,并获取mean

nm1 <- c("x", "y", "z")
na.omit(a[, paste0(nm1, 2)  := lapply(.SD, function(x) shift(x, 2, 
     type = "lead")), .SDcols = nm1])[, .(Mean = mean(unlist(.SD))),
           .(second = paste0(second, "-", second + 1))]
#  second     Mean
#1:    1-2 3.666667
#2:    2-3 5.000000
#3:    3-4 6.333333
#4:    4-5 7.666667

或者稍微紧凑的选项

library(dplyr)
cbind(a[second!= last(second)], a[second!= first(second)])[
    ,.(Mean = mean(unlist(.SD))), .(second = paste0(second, "-", second+1))]
#   second     Mean
#1:    1-2 3.666667
#2:    2-3 5.000000
#3:    3-4 6.333333
#4:    4-5 7.666667

或者另一种选择是将它们放在listrbind数据集中,创建一个新的&#39; id1&#39;在mean unlist之后获取.SDcols,或者我们可以获得每列的mean

dt1 <- rbindlist(list(a[second!= last(second)], 
     a[second!= first(second)]), idcol=TRUE)[, id1:= as.numeric(gl(.N, 2, .N)), .id][]

通过&#39; second&#39;

获取每列的mean
dt1[, lapply(.SD, mean), .(second = paste0(id1, "-", id1 + 1)), .SDcols = x:z]

通过第二个&#39;

获取整个mean
dt1[, mean(unlist(.SD)), .(second = paste0(id1, "-", id1 +1)), .SDcols = x:z]