【问题标题】:Combining vector and binary search in data.table在 data.table 中结合向量和二进制搜索
【发布时间】:2015-05-14 01:00:55
【问题描述】:

有时,我有一个键控 data.table,我想根据它的键 一个未键控的列进行子集化。最简单/最快的方法是什么?

最自然的感觉是错误:

dt <- data.table(id = 1:100, var = rnorm(100), key = "id")
dt[.(seq(1, 100, 2)) & var > 0, ]

下一个最干净的事情是链:

dt[.(seq(1, 100, 2))][var > 0, ]

当然我们可以完全放弃使用二分搜索(我认为这显然是应该避免的):

dt[id %in% seq(1, 100, 2) & var > 0, ]

有没有我遗漏的方法?另外,为什么第一个是错误的任何特殊原因?语法对我来说似乎很清楚。

【问题讨论】:

  • 我赌的是“干净”的链条。如果您的第二个条件是不等式,我怀疑当前的索引系统是否有帮助。现在有关于平等条件的“自动索引”,但我不确定细节。新闻中提到:github.com/Rdatatable/data.table 如果您需要对您的子集执行by=.EACHI,我猜您将不得不切换链。 dt[var&gt;2][.(seq(1,100,2)),...do stuff...,by=.EACHI]
  • 见 cmets here
  • 所以看起来答案真的取决于我想在j 中做什么,可以这么说吗?

标签: r data.table


【解决方案1】:

在撰写本文时,原生方式:

dt[.(seq(1, 100, 2)) & var > 0, j] #some expression j

如下:

dt[.(seq(1, 100, 2)), .SD[var > 0, j]]

我使用data.table 的次数越多,这就越自然,但看起来还是有点不直观。生活吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多