【问题标题】:values exist in data.table in multiple columns R值存在于 data.table 中的多列 R
【发布时间】:2014-09-25 17:45:38
【问题描述】:

我有一个数据表

dt <- data.table(c(1,2,3,4),c("chr1","chr1","chr2","chr3"),c(12,12,13,14))

这只是一个示例数据框,但实际上我有数百万行和三列。 我需要找出其中是否存在一组值。 例如,我想检查第2列中的“chr1”和列中的“2”是否同时存在?

我正在使用"chr1" %in% dt$V2,但不知道如何结合两个价值标准并使其快速处理数百万行。

【问题讨论】:

  • 可能是dt[, V1==2 &amp; V2=='chr1']#[1] FALSE TRUE FALSE FALSE
  • 我需要更快的搜索,因为有数百万行,搜索大约需要 4 秒。
  • 对于单值比较,== 应该比 %in% 快。我不确定将两列粘贴在一起并进行比较是否会更快。
  • 我有 setkeys(dt,"V1","V2")。但不知道如何使用它来提高速度
  • @user1631306 dt[J(2, 'chr1')]

标签: r data.table


【解决方案1】:

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 将使用二进制搜索方法。这是一个很棒的功能,我想你会同意的;)。

【讨论】:

  • 那真的很快,但它返回我的行(在任何情况下,值存在与否)。尽管第三列将是 NA,但如果值不存在。我可以用它来把它变成 TRUE 或 FALSE,但是有什么干净的解决方案吗?
  • 我在data.table 中编辑了nomatch 参数的使用。这就是你要找的东西吗?
  • 我正在寻找简单的 TRUE 或 FALSE 返回。但我想,我可以很容易地使用“NA”。感谢您的帮助
  • @user1631306 as.logical(nrow(DT[J(2, "chr1"), nomatch=0L])) 可以解决问题。
猜你喜欢
  • 2016-08-26
  • 2017-10-04
  • 2022-01-05
  • 2017-06-22
  • 1970-01-01
  • 2015-07-28
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多