【问题标题】:How do I select rows by two criteria in data.table in R如何在 R 中的 data.table 中按两个条件选择行
【发布时间】:2012-01-20 12:42:22
【问题描述】:

假设我有一个 data.table,我想选择变量 x 的值为 b 的所有行。这很容易

library(data.table)
DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
setkey(DT,x)               # set a 1-column key
DT["b"]

顺便说一句,似乎必须设置一个键,如果该键未设置为 x 则这不起作用。顺便说一句,如果我将两列设置为键会发生什么?

无论如何,继续前进,假设我想选择变量 x 为 a 或 b 的所有行

DT["b"|"a"]

没用

但以下工作

DT[x=="a"|x=="b"]

但这使用矢量扫描数据帧。它不使用二进制搜索。我猜对于较小的数据集,这无关紧要。

这是我应该做的还是我对 data.table 语法一无所知?

还有一件事。是否有使用 data.table 的更复杂的布尔多变量选择(或子集)过程的示例?

我知道我总是可以恢复使用 subset() 函数,因为如果必须,data.table 将表现为 data.frame。

【问题讨论】:

  • 介绍小插图中有一个详细的多列键工作示例。
  • 不确定在提示符下处理 example(data.table) 的结果有多广为人知 - 示例在那里。

标签: r select subset data.table


【解决方案1】:

使用%in% 运算符似乎会带来 2 倍的性能提升。考虑:

library(data.table)
library(rbenchmark)
DT <- data.table(x=sample(letters, 1e6, TRUE), y=rnorm(1e6), v=runif(1e6))
setkey(DT,x)               # set a 1-column key
DT["b"]
f1 <- function() DT[x %in% letters[1:2]]
f2 <- function() DT[x=="a"| x == "b"]

> benchmark(f1(),f2())
  test replications elapsed relative user.self sys.self user.child sys.child
1 f1()          100    8.40 1.000000      7.58     0.81         NA        NA
2 f2()          100   17.11 2.036905     15.54     1.56         NA        NA

> all.equal(f1(), f2())
[1] TRUE

编辑:添加 Farrel 的选项

注意,这是在不同的计算机上,但相对的颠簸是相同的。

f3 <- function() DT[c("a", "b")]

  test replications elapsed  relative user.self sys.self user.child sys.child
1 f1()          100  11.281  7.121843     9.745    1.323          0         0
2 f2()          100  23.106 14.587121    20.824    2.224          0         0
3 f3()          100   1.584  1.000000     1.042    0.541          0         0

【讨论】:

    【解决方案2】:

    这是我提出问题后才想到的一种方法,它有效,但我不知道它在基准测试中的效果如何。我目前不在安装了 R 的计算机上。我想我应该使用云实例。反正我喜欢这个语法

    DT[c("a","b")]
    

    【讨论】:

    • 我将它添加到下面的基准测试中,它是迄今为止三种解决方案中执行速度最快的。干得好。
    • 太棒了。这被称为 by without by,也称为 grouping by i。有点类似于 SQL 中的拥有
    • 当您掌握了按i 分组的窍门后,下一个学习步骤是加入继承范围。运行example(data.table),结果显示一个例子。
    猜你喜欢
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    相关资源
    最近更新 更多