【发布时间】:2019-03-28 16:26:05
【问题描述】:
我有一个 data.table l1,其中包含三列,Minute,Posixct 表示时间,group_cor 表示我的值,我想根据 data.table s1 计算特定时间间隔内 group_cor 的唯一值的数量。在我的原始数据集中,我有大约 1500000 个数据行,持续大约 12 天(结构为 l1),所以我正在寻找一种快速的方法来处理所有这些数据。
Posixct group_cor Minute
1: 2017-08-11 13:31:36 185 2017-08-11 13:31:00
2: 2017-08-11 13:31:36 185 2017-08-11 13:31:00
3: 2017-08-11 13:31:36 185 2017-08-11 13:31:00
4: 2017-08-11 13:31:37 186 2017-08-11 13:31:00
5: 2017-08-11 13:31:37 186 2017-08-11 13:31:00
6: 2017-08-11 13:31:37 187 2017-08-11 13:31:00
7: 2017-08-11 13:31:37 187 2017-08-11 13:31:00
8: 2017-08-11 13:31:37 187 2017-08-11 13:31:00
9: 2017-08-11 13:31:37 187 2017-08-11 13:31:00
这是 s1,其中 start 表示时间间隔的开始,结束时间间隔的结束。每个时间间隔为一分钟,此窗口一次移动 1 秒。
start end
1: 2017-08-11 13:31:36 2017-08-11 13:32:36
2: 2017-08-11 13:31:37 2017-08-11 13:32:37
3: 2017-08-11 13:31:38 2017-08-11 13:32:38
4: 2017-08-11 13:31:39 2017-08-11 13:32:39
5: 2017-08-11 13:31:40 2017-08-11 13:32:40
我尝试使用 data.table 将 No 列添加到 data.table s1 中,我使用“on”参数指定时间窗口。
oma <- function(x) length(unique(x))
s1[ l1, No:=oma(group_cor), on=c('start<Posixct','end>=Posixct')]
然而,这给了
> s1
start end No
1: 2017-08-11 13:31:36 2017-08-11 13:32:36 188
2: 2017-08-11 13:31:37 2017-08-11 13:32:37 188
3: 2017-08-11 13:31:38 2017-08-11 13:32:38 188
4: 2017-08-11 13:31:39 2017-08-11 13:32:39 188
5: 2017-08-11 13:31:40 2017-08-11 13:32:40 188
所有时间窗口的 No 列都是 188,这是不正确的(我不知道这个值来自哪里..)
> range(s1$No)
[1] 188 188
我知道每分钟唯一值的数量,新的 No 应该与它们相似
> tapply(l1$group_cor, l1$Minute,oma)
2017-08-11 13:31:00 2017-08-11 13:32:00 2017-08-11 13:33:00 2017-08-11 13:34:00
11 17 18 17
2017-08-11 13:35:00 2017-08-11 13:36:00 2017-08-11 13:37:00 2017-08-11 13:38:00
21 22 23 22
2017-08-11 13:39:00 2017-08-11 13:40:00
20 22
我做错了什么?任何帮助将不胜感激!还建议我如何以另一种方式做到这一点。非常感谢。
【问题讨论】:
-
我想也许你需要一个
by=.EACHI在你的连接中,否则它只是在连接中使用完整的group_cor向量。顺便说一句,oma已经在 data.table 中为uniqueN。 -
感谢您的建议和指出
uniqueN。我尝试运行s1[ l, No:=uniqueN(group_cor), on=c('start<Posixct','end>=Posixct'), by=.EACHI]但我没有得到正确的答案。我没有得到Noas 1 列中的所有值。它现在在做什么? -
我从未想出纯 data.table 解决方案,但最终使用
d <- lapply(seq_len(nrow(s1)),function(n) { a <- l1[Posixct > s1$start[n] & Posixct <= s1$end[n], .(No = uniqueN(group_cor))] })并将列表d(在我将其转换为矢量之后)添加到 data.tables1跨度>
标签: r data.table subset