首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过not head(key(DT),m)子集data.table,使用二进制搜索而不是矢量扫描

通过not head(key(DT),m)子集data.table,使用二进制搜索而不是矢量扫描
EN

Stack Overflow用户
提问于 2013-04-03 00:54:22
回答 2查看 762关注 0票数 7

如果我指定n列作为data.table的键,我知道只要连接到key(DT)head,就可以连接比键中定义的列更少的列。例如,对于n=2:

代码语言:javascript
运行
复制
X = data.table(A=rep(1:5, each=2), B=rep(1:2, each=5), key=c('A','B'))
X
    A B
 1: 1 1
 2: 1 1
 3: 2 1
 4: 2 1
 5: 3 1
 6: 3 2
 7: 4 2
 8: 4 2
 9: 5 2
10: 5 2

X[J(3)]
   A B
1: 3 1
2: 3 2

在那里,我只连接到了DT的两列键的第一列。我知道我可以像这样连接到键的两列:

代码语言:javascript
运行
复制
X[J(3,1)]
   A B
1: 3 1

但是如何仅使用键的第二列列(例如B==2),而仍然使用二进制搜索而不是向量扫描呢?我知道这是一个复制品:

Subsetting data.table by 2nd column only of a 2 column key, using binary search not vector scan

所以我想把这个问题推广到n。我的数据集有大约一百万行,上面链接的dup问题中提供的解决方案似乎不是最优的。

EN

回答 2

Stack Overflow用户

发布于 2013-04-03 12:47:54

下面是一个简单的函数,它将提取正确的唯一值并返回一个数据表作为键。

代码语言:javascript
运行
复制
 X <- data.table(A=rep(1:5, each=4), B=rep(1:4, each=5), 
                  C = letters[1:20], key=c('A','B','C'))
 make.key <- function(ddd, what){
  # the names of the key columns
  zzz <- key(ddd)
  # the key columns you wish to keep all unique values
  whichUnique <- setdiff(zzz, names(what))
  ## unique data.table (when keyed); .. means "look up one level"
  ud <-  lapply([, ..whichUnique], unique)
  ## append the `what` columns and  a Cross Join of the new
  ## key columns
  do.call(CJ, c(ud,what)[zzz])
}   

X[make.key(X, what = list(C = c('a','b'))),nomatch=0]
## A B C
## 1: 1 1 a
## 2: 1 1 b

不过,我不确定这会不会比在大型data.table上进行几次矢量扫描更快。

票数 5
EN

Stack Overflow用户

发布于 2013-04-03 17:49:55

添加辅助密钥在功能请求列表中:

FR#1007 Build in secondary keys

在此期间,我们要么使用矢量扫描,要么使用问题中链接的n=2案例的答案中使用的方法( @mnel在他的答案中很好地概括了这一点)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15769837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档