我有一些示例数据,其中有(错误的)重叠间隔,所以我想将数据分成不重叠的间隔,根据原始数据将数据添加到每个间隔。使用数据表的聚合重叠间隔
假设我有一个数据表是这样的:
x <- c(1000, 2000, 2000, 1000, 1500)
y <- c(1200, 3000, 4000, 2000, 3000)
z <- c("a", "a", "a", "b", "b")
n1 <- 1:5
n2 <- 4:8
DT <- data.table(id=z,
start=as.POSIXct(x, origin = "2016-01-01"),
end=as.POSIXct(y, origin = "2016-01-01"),
x=x,
y=y,
data1=n1,
data2=n2)
DT
id start end x y data1 data2
1: a 2016-01-01 01:16:40 2016-01-01 01:20:00 1000 1200 1 4
2: a 2016-01-01 01:33:20 2016-01-01 01:50:00 2000 3000 2 5
3: a 2016-01-01 01:33:20 2016-01-01 02:06:40 2000 4000 3 6
4: b 2016-01-01 01:16:40 2016-01-01 01:33:20 1000 2000 4 7
5: b 2016-01-01 01:25:00 2016-01-01 01:50:00 1500 3000 5 8
每个ID我想聚合数据,使用每个间隔中的数据的总和。对于id==a
,它应该是这样的:
1: a 2016-01-01 01:16:40 2016-01-01 01:20:00 1000 1200 1 4
2: a 2016-01-01 01:33:20 2016-01-01 01:50:00 2000 3000 3.5 8
3: a 2016-01-01 01:50:01 2016-01-01 02:06:40 3001 4000 1.5 3
自3排的一半将被添加到排2.对于id=="b"
,它变得有点复杂:
4: b 2016-01-01 01:16:40 2016-01-01 01:24:59 1000 1499 2 3.5
5: b 2016-01-01 01:25:00 2016-01-01 01:33:20 1500 2000 3.67 6.16
6: b 2016-01-01 01:33:21 2016-01-01 01:50:00 2001 3000 3.33 5.33
这里一个额外的行因为我们有三个不同的时间。根据原始区间中的数据将数据分成每一行。例如DT$data1[5]
计算为1/2 * 4 + 1/3 * 5
。
我假设你可以在data.table中使用foverlaps,但我真的不知道如何。请帮忙。
你接受'dplyr'解决方案吗?> _ < – Wen
当然。只要它工作 –
为什么'DT $ data1 [5]'是'1/2 * 4 + 1/3 * 5'而不是'1/2 * 4 + 1/2 * 5'。换句话说,为什么权重不等于一,而不是一半,因为两者都有“半”(几乎)的时期? –