这个问题不清楚,也没有提供足够的数据来处理,但它很有用,所以如果有人可以用我以后提供的数据编辑它,欢迎提供。帖子的标题也可以完成:Matthew Dowle 经常回答 subsetting-over-two-vectors 问题,但较少回答 subsetting-according-a-in-statement-on-one-vector 的问题。我一直在寻找答案,直到在这里找到一个字符向量。
让我们考虑一下这些数据:
library(data.table)
n <- 100
X <- data.table(a=sample(c(10,20,25,30,40),n,replace=TRUE),b=1:n)
对应的 data.table 样式查询X[X$a %in% c(10,20),]
有点令人惊讶:
setkey(X,a)
X[.(c(10,20))]
X[.(10,20)] # works for characters but not for integers
# instead, treats 10 as the filter
# and 20 as a new variable
# for comparison :
X[X$a %in% c(10,20),]
现在,哪个最好?如果您的密钥已经设置,显然是 data.table。否则,它可能不会,因为证明以下时间测量(在我的 1,75 Go RAM 计算机上):
n <- 1e7
X <- data.table(a=sample(c(10,20,25,30,40),n,replace=TRUE),b=1:n)
system.time(X[X$a %in% c(10,20),])
# utilisateur système écoulé (yes, I'm French)
# 1.92 0.06 1.99
system.time(setkey(X,a))
# utilisateur système écoulé
# 34.91 0.05 35.23
system.time(X[J(c(10,20))])
# utilisateur système écoulé
# 0.15 0.08 0.23
但也许马修有更好的解决方案......
[Matthew] 您发现排序类型numeric
(又名double
)比integer
. 多年来,我们不允许double
输入密钥,因为担心用户会落入这个陷阱并报告这样的糟糕时机。我们有些担心地允许double
输入键,因为目前还没有实现快速排序double
。快速排序integer
并且character
非常好,因为这些是使用计数排序完成的。希望有一天我们能快速分类!numeric
(现已实施 - 见下文)。
1.9.0 之前的 data.table 上的计时
n <- 1e7
X <- data.table(a=sample(c(10,20,25,30,40),n,replace=TRUE),b=1:n)
system.time(setkey(X,a))
# user system elapsed
# 13.898 0.138 14.216
X <- data.table(a=sample(as.integer(c(10,20,25,30,40)),n,replace=TRUE),b=1:n)
system.time(setkey(X,a))
# user system elapsed
# 0.381 0.019 0.408
请记住,默认情况下2
输入numeric
R。2L
是integer
。虽然data.table
接受numeric
它还是比较喜欢的integer
。
从 v1.9.0 开始实现了数字的快速基数排序。
从 v1.9.0 开始
n <- 1e7
X <- data.table(a=sample(c(10,20,25,30,40),n,replace=TRUE),b=1:n)
system.time(setkey(X,a))
# user system elapsed
# 0.832 0.026 0.871