gpt4 book ai didi

r - 不使用 head(key(DT),m) 对 data.table 进行子集化,使用二进制搜索而不是矢量扫描

转载 作者:行者123 更新时间:2023-12-04 09:38:36 27 4
gpt4 key购买 nike

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

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 的 2 列键的第一列.我知道我可以像这样加入键的两列:
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 问题中提供的解决方案似乎不是最佳的。

最佳答案

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

 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 进行几次矢量扫描更快。

关于r - 不使用 head(key(DT),m) 对 data.table 进行子集化,使用二进制搜索而不是矢量扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15769837/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com