我有一个data.table
dt <- data.table(c(1,2,3,4),c("chr1","chr1","chr2","chr3"),c(12,12,13,14))
这只是一个示例数据框架,但实际上我有数百万行有三列。 我需要查找是否存在一组值。 例如,我想检查&#34; chr1&#34;在第2栏和&#34; 2&#34;列中是否存在?
我正在使用"chr1" %in% dt$V2
,但不知道如何结合两个值标准,并使其快速达到数百万行。
答案 0 :(得分:4)
在data.table
中,我们可以同时使用a)传统的矢量扫描方法(base-R和dplyr的滤波器做什么),以及b)使用二进制搜索,它比(a)中。
require(data.table)
setkey(dt, V1, V2)
dt[J(2, "chr1"), nomatch=0L] # by default nomatch=NA
当没有匹配项时, nomatch=NA
返回NA,nomatch=0L
仅返回匹配的行。
按data.table
设置按这些列排序的键(并设置属性sorted
)。这有助于对数据使用binary search
,以O(log n)
时间复杂度(平均)搜索查询,而不是具有O(n)复杂度的向量扫描方法(因为它必须扫描)通过所有行)。它还需要一个逻辑向量,其大小与数据中的行数相同。
@akrun和@rrs所展示的是分别使用data.table
和dplyr
的矢量扫描方法的示例。 @eddi使用data.table
向您展示(在此答案中重复)二进制搜索方法。
如果您想多次进行子集化,这将非常有用。
在data.table
的下一个版本中,我们试图通过常规矢量扫描语法在内部实现此加速。马特实施了它,并对其进行了测试。如果出现这种情况,您可以使用通常的矢量扫描语法,在内部,data.table
将使用二进制搜索方法。这是一个很棒的功能,我认为你同意;)。