我有一个关于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循环,但因为我有一个庞大的数据集,所以需要很长时间。你知道如何使用数据表工具吗? 非常感谢
答案 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
或者另一种选择是将它们放在list
,rbind
数据集中,创建一个新的&#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]