值存在于多列R中的data.table中

时间:2014-09-25 17:45:38

标签: r data.table

我有一个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,但不知道如何结合两个值标准,并使其快速达到数百万行。

1 个答案:

答案 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.tabledplyr的矢量扫描方法的示例。 @eddi使用data.table向您展示(在此答案中重复)二进制搜索方法。

如果您想多次进行子集化,这将非常有用。

data.table的下一个版本中,我们试图通过常规矢量扫描语法在内部实现此加速。马特实施了它,并对其进行了测试。如果出现这种情况,您可以使用通常的矢量扫描语法,在内部,data.table将使用二进制搜索方法。这是一个很棒的功能,我认为你同意;)。