R:匹配条件向量的行的快速计数

R:匹配条件向量的行的快速计数,r,data.table,vectorization,R,Data.table,Vectorization,我有数据 dt <- data.table(beg=as.POSIXct(c("2018-01-01 01:01:00","2018-01-01 01:05:00","2018-01-01 01:08:00")), end=as.POSIXct(c("2018-01-01 01:10:00","2018-01-01 01:10:00","2018-01-01 01:10:00"))) > dt beg end 1:

我有数据

dt <- data.table(beg=as.POSIXct(c("2018-01-01 01:01:00","2018-01-01 01:05:00","2018-01-01 01:08:00")), end=as.POSIXct(c("2018-01-01 01:10:00","2018-01-01 01:10:00","2018-01-01 01:10:00")))
> dt
                   beg                 end
1: 2018-01-01 01:01:00 2018-01-01 01:10:00
2: 2018-01-01 01:05:00 2018-01-01 01:10:00
3: 2018-01-01 01:08:00 2018-01-01 01:10:00
将产生解决方案

> data.table(times, count)
                   time count
 1: 2018-01-01 01:01:00     0
 2: 2018-01-01 01:02:00     1
 3: 2018-01-01 01:03:00     1
 4: 2018-01-01 01:04:00     1
 5: 2018-01-01 01:05:00     1
 6: 2018-01-01 01:06:00     2
 7: 2018-01-01 01:07:00     2
 8: 2018-01-01 01:08:00     2
 9: 2018-01-01 01:09:00     3
10: 2018-01-01 01:10:00     0
但是我想知道是否有一个更省时的解决方案,例如使用data.table。

这可能是一个解决方案

times = as.data.table(times)
ans = dt[times, .(x.beg, x.end, i.x),on = .(beg < x , end > x),allow.cartesian = TRUE]
ans[,sum(!is.na(x.end)), by = .(i.x)]
                    i.x V1
 1: 2018-01-01 01:01:00  0
 2: 2018-01-01 01:02:00  1
 3: 2018-01-01 01:03:00  1
 4: 2018-01-01 01:04:00  1
 5: 2018-01-01 01:05:00  1
 6: 2018-01-01 01:06:00  2
 7: 2018-01-01 01:07:00  2
 8: 2018-01-01 01:08:00  2
 9: 2018-01-01 01:09:00  3
10: 2018-01-01 01:10:00  0
times=as.data.table(times)
ans=dt[乘以,(x.beg,x.end,i.x),on=(begx),allow.cartesian=TRUE]
ans[,和(!is.na(x.end)),由=(i.x)]
i、 xv1
1: 2018-01-01 01:01:00  0
2: 2018-01-01 01:02:00  1
3: 2018-01-01 01:03:00  1
4: 2018-01-01 01:04:00  1
5: 2018-01-01 01:05:00  1
6: 2018-01-01 01:06:00  2
7: 2018-01-01 01:07:00  2
8: 2018-01-01 01:08:00  2
9: 2018-01-01 01:09:00  3
10: 2018-01-01 01:10:00  0

干杯

我问了一个类似的问题,这可能会有所帮助。查看
Rcpp
解决方案,尽管有
数据。表也有
解决方案谢谢!但它给了我一个错误:`“逻辑错误。我不是data.table,但提供了'on'参数。”`
times
必须是data.table,e。G通过
dt.times转换,您可以使用列表而不是数据表。另外,
by=.EACHI
帮助:
dt[(t=times),on=(begt),.N,by=.EACHI]
比for循环有效得多。干杯
> data.table(times, count)
                   time count
 1: 2018-01-01 01:01:00     0
 2: 2018-01-01 01:02:00     1
 3: 2018-01-01 01:03:00     1
 4: 2018-01-01 01:04:00     1
 5: 2018-01-01 01:05:00     1
 6: 2018-01-01 01:06:00     2
 7: 2018-01-01 01:07:00     2
 8: 2018-01-01 01:08:00     2
 9: 2018-01-01 01:09:00     3
10: 2018-01-01 01:10:00     0
times = as.data.table(times)
ans = dt[times, .(x.beg, x.end, i.x),on = .(beg < x , end > x),allow.cartesian = TRUE]
ans[,sum(!is.na(x.end)), by = .(i.x)]
                    i.x V1
 1: 2018-01-01 01:01:00  0
 2: 2018-01-01 01:02:00  1
 3: 2018-01-01 01:03:00  1
 4: 2018-01-01 01:04:00  1
 5: 2018-01-01 01:05:00  1
 6: 2018-01-01 01:06:00  2
 7: 2018-01-01 01:07:00  2
 8: 2018-01-01 01:08:00  2
 9: 2018-01-01 01:09:00  3
10: 2018-01-01 01:10:00  0