首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在data.table中执行否定/匹配/反向搜索?

如何在data.table中执行否定/匹配/反向搜索?
EN

Stack Overflow用户
提问于 2012-09-07 21:28:48
回答 2查看 7.4K关注 0票数 20

如果我想使用二进制搜索选择data.table中不包含键变量特定值的所有行,会发生什么情况?顺便问一下,对于我想要做的事情,正确的术语是什么?是"nojoin“吗?这是“负面选择”吗?

代码语言:javascript
代码运行次数:0
运行
复制
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
setkey(DT,x)

让我们对x==为“a”但使用二进制搜索的所有行进行正选择

代码语言:javascript
代码运行次数:0
运行
复制
DT["a"]

这很美,但我想要的正好相反。我想要所有不是"a“的行,换句话说,其中x!="a”

代码语言:javascript
代码运行次数:0
运行
复制
DT[x!="a"]

这是一种矢量扫描。上面的代码行得通,但使用的是矢量扫描。我想使用二进制。我原本希望下面的方法能起作用,但是……

代码语言:javascript
代码运行次数:0
运行
复制
DT[!"a"]
DT[-"a"]

以上两种方法都不起作用,尝试使用nomatch也无济于事。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-07 22:08:57

成语是这样的:

代码语言:javascript
代码运行次数:0
运行
复制
DT[-DT["a", which=TRUE]]

   x y v
1: b 1 4
2: b 3 5
3: b 6 6
4: c 1 7
5: c 3 8
6: c 6 9

灵感来自:

Porting set operations from R's data frames to data tables: How to identify duplicated rows?上发布上一个问题的邮件列表

更新。v1.8.3中的新功能是not-join语法。法雷尔的第一个期望(!而不是-)已经实现了:

代码语言:javascript
代码运行次数:0
运行
复制
DT[-DT["a",which=TRUE,nomatch=0],...]   # old idiom
DT[!"a",...]                            # same result, now preferred.

有关更多详细信息和示例,请参阅NEWS项目。

票数 19
EN

Stack Overflow用户

发布于 2012-09-08 01:30:16

Andrie的答案很好,这也是我可能会使用的。不过,有趣的是,下面的构造似乎(只快了一点),特别是当data.tables的大小增加时。

代码语言:javascript
代码运行次数:0
运行
复制
DT[J(x = unique(DT)[x!="a"][,x])]

##-------------------------------- Timings -----------------------------------##

library(data.table)
library(rbenchmark)

DT = data.table(x=rep(c("a","b","c"),each=45e5), y=c(1,3,6), v=1:9, key="x")
Josh <- function() DT[J(x = unique(DT)[x!="a"][,x])]
Andrie <- function() DT[-DT["a", which=TRUE]]

## Compare results
identical(Josh(), setkey(Andrie(), "x"))  
# [1] TRUE

## Compare timings
benchmark(replications = 10, order="relative", Josh=Josh(), Andrie=Andrie())
    test replications elapsed relative user.self sys.self user.child sys.child
1   Josh           10   17.50    1.000     14.78      3.6         NA        NA
2 Andrie           10   18.75    1.071     16.52      3.2         NA        NA

如果可以让DT[,x]返回一个data.table而不是一个向量,我特别想使用它。然后,可以将构造简化为DT[unique(DT[,x])[x!="a"]]。此外,即使键中有多个列,它也可以工作,而目前它还不能。

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

https://stackoverflow.com/questions/12319083

复制
相关文章

相似问题

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