R 如何在具有重叠值的data.table中分组?

R 如何在具有重叠值的data.table中分组?,r,data.table,R,Data.table,我有一个关于R中data.table的问题。 我正在处理一个加速数据,它要求我从原始数据生成特征。我想按每2秒对数据进行分组。很容易再生成一列,每2秒钟显示一个组,并使用“按”分组。 但是,我想做重叠窗口。例如,我的原始数据如下 a=data.table(x = c(1:10), y= c(2:11), z = c(5), second=rep(c(1:5),each=2)) x y z秒 1:1251 2:2351 3:3452 4:452 5:5653 6:6753 7:7854 8:89

我有一个关于R中data.table的问题。 我正在处理一个加速数据,它要求我从原始数据生成特征。我想按每2秒对数据进行分组。很容易再生成一列,每2秒钟显示一个组,并使用“按”分组。 但是,我想做重叠窗口。例如,我的原始数据如下

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

1:1251

2:2351

3:3452

4:452

5:5653

6:6753

7:7854

8:8954

9:9105

10:101155

现在,我想每2秒计算x,y,z列的平均值。1和2、2和3、3和4、4和5。 我可以运行for循环,但由于我有一个巨大的数据集,这将需要很长时间。您知道如何仅使用数据表工具来实现它吗?
非常感谢

因为“秒”只有两个唯一的观察值,我们得到了“x”、“y”、“z”列的
前导
,按“秒”分组,
取消列出
数据表的子集,并得到
平均值

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

或者另一个选项是将它们放在
列表中,
rbind
数据集,创建一个新的“id1”列,在
取消
.SDcols
列表后获得
平均值
,或者我们可以获得每个列的单个
平均值

dt1 <- rbindlist(list(a[second!= last(second)], 
     a[second!= first(second)]), idcol=TRUE)[, id1:= as.numeric(gl(.N, 2, .N)), .id][]
通过“秒”获取整个
平均值

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

由于“second”只有两个唯一的观察值,我们得到“x”、“y”、“z”列的
前导值,按“second”分组,
取消列出
Data.table的子集,并得到
平均值

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

或者另一个选项是将它们放在
列表中,
rbind
数据集,创建一个新的“id1”列,在
取消
.SDcols
列表后获得
平均值
,或者我们可以获得每个列的单个
平均值

dt1 <- rbindlist(list(a[second!= last(second)], 
     a[second!= first(second)]), idcol=TRUE)[, id1:= as.numeric(gl(.N, 2, .N)), .id][]
通过“秒”获取整个
平均值

dt1[, lapply(.SD, mean), .(second = paste0(id1, "-", id1 + 1)), .SDcols = x:z]
dt1[, mean(unlist(.SD)), .(second = paste0(id1, "-", id1 +1)), .SDcols = x:z]
还有一种方法:

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
,但我不清楚它背后的规则是什么

通常,如果跨列计算统计信息,则数据的格式不正确。如果您有时间,我建议您阅读。

这里有另一种方式:

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
,但我不清楚它背后的规则是什么


通常,如果跨列计算统计信息,则数据的格式不正确。如果您有时间,我建议您阅读。

对不起,这里的对象nm1是什么?@ThanhQuang它是“x”、“y”、“z”。更新Hi,Akrun,如果我想计算每2秒x,y z的单个平均值怎么办?@ThanhQuang而不是
unlist
,我们做
lapply(.SD,mean)
对不起,这里的对象nm1是什么?@ThanhQuang它是'x','y','z'。更新Hi,Akrun,如果我想计算每2秒x,y z的单个平均值怎么办?@ThanhQuang不是
unlist
,而是
lapply(.SD,mean)
请显示您想要的输出。请显示您想要的输出。