Far*_*rel 26 select r subset data.table
假设我有一个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"]
Run Code Online (Sandbox Code Playgroud)
顺便说一句,似乎必须设置一个键,如果键没有设置为x,那么这不起作用.顺便说一句,如果我将两列设为键,会发生什么?
无论如何,继续前进,让我说我想选择变量x是a或b的所有行
DT["b"|"a"]
Run Code Online (Sandbox Code Playgroud)
不起作用
但以下工作
DT[x=="a"|x=="b"]
Run Code Online (Sandbox Code Playgroud)
但是,它使用矢量扫描数据帧.它不使用二进制搜索.我想对于较小的数据集来说无关紧要.
这是我应该做的还是我对data.table语法一无所知?
还有一件事.是否有任何更复杂的布尔多变量选择(或子集)过程的例子与data.table?
我知道我总是可以恢复使用subset()函数,因为如果必须,data.table将表现为data.frame.
Far*_*rel 15
在我提出这个问题之后,这种方式只能在我脑海中浮现,但是我不知道它在基准测试中的作用.我目前不在安装了R的计算机上.我想我应该使用云实例.无论如何,我喜欢语法
DT[c("a","b")]
Run Code Online (Sandbox Code Playgroud)
Cha*_*ase 14
使用%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
Run Code Online (Sandbox Code Playgroud)
编辑:添加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
Run Code Online (Sandbox Code Playgroud)