我有更多的数据,需要满足特定条件的行的行数。包data.table。
days <- strptime(c("2013-01-01 8:00:00", "2013-02-01 8:00:00"), format="%Y-%m-%d %H:%M:%S")
DateTime <- rep(seq(days[1], days[2], length.out=1e6/5), 5)
Update <- rep(LETTERS[3:1], length.out=1e6)
Group <- rep(c("AAA", "BBB", "CCC"), length.out=1e6)
Weight <- trunc(rnorm(1e6, 110, 3))
Weight2 <- rnorm(1e6, 100, 1.5)
DT <- data.table(DateTime, Update, Group, Weight, Weight2)
setkey(DT, DateTime, Update, Group, Weight, Weight2)
Exp <- DT[1e6/2]
我无法创建另一个data.table作为没有DateTime列的子集,因为此列在密钥中使用。在子集上创建新密钥可能会改变顺序,我需要确定保留原始订单。
使用这两个命令可以获得我需要的行号。
system.time(DT[, which(DT$Update==Exp$Update & DT$Group==Exp$Group & DT$Weight==Exp$Weight & DT$Weight2==Exp$Weight2)])
system.time(which(DT$Update==Exp$Update & DT$Group==Exp$Group & DT$Weight==Exp$Weight & DT$Weight2==Exp$Weight2))
但是我需要更快的方法来做到这一点。
感谢您提出任何建议。
答案 0 :(得分:0)
可以通过以下方式获取行号。
which(is.na(DT[list(DT$DateTime, DT$Update,
DT$Group, DT$Weight, Exp$Weight2), which=TRUE]) == FALSE)
然而,它比问题中的矢量搜索示例慢4倍。