2016-08-05 78 views
1

我有一个关于R中的data.table的问题。 我正在研究加速度数据,这需要我从原始数据中生成特征。我想每2秒分组数据。通过生成1个更多的列可以很容易地指出每2秒钟的组和by组。 但是,我想做重叠的窗口。例如,我的原始数据是这如何在具有重叠值的data.table中进行分组?

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

XYZ第二

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列的平均值。 1and2,2,3,3,4,4和5. 我可以运行for循环,但由于我有一个巨大的数据集,这将需要很长时间。你知道怎么只用数据表工具吗? 非常感谢

+0

请显示您所需的输出。 – Frank

回答

1

由于只有2“第二”的独特观察,我们得到的“X”,“Y”,“Z”列lead,通过数据的“第二” unlist子集分组.table并获得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数据集,创建一个新的 'ID1' 列,在unlist之后得到mean.SDcols或者我们可以得到各列的个体mean

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

获取mean由每列 '第二'

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

得到整个mean通过 '第二'

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

对不起,这里nm1是什么对象? –

+0

@ThanhQuang它是'x','y','z'。更新 – akrun

+1

非常感谢!它的工作原理 –

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 

我相信你可以合作te ag较少手动,但我不清楚它背后的规则是什么。

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

相关问题