R 如何在具有重叠值的data.table中分组?
我有一个关于R中data.table的问题。 我正在处理一个加速数据,它要求我从原始数据生成特征。我想按每2秒对数据进行分组。很容易再生成一列,每2秒钟显示一个组,并使用“按”分组。 但是,我想做重叠窗口。例如,我的原始数据如下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
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)
请显示您想要的输出。请显示您想要的输出。