Как выбрать строки по двум критериям в data.table в R - PullRequest
26 голосов
/ 14 декабря 2011

Допустим, у меня есть 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, если это необходимо.

Ответы [ 2 ]

15 голосов
/ 15 декабря 2011

Вот способ, который пришел мне в голову только после того, как я задал вопрос, и он работает, но я не знаю, как это происходит в тестах.Я сейчас не за компьютером с установленным R. Думаю, мне следует использовать облачный экземпляр.Во всяком случае, мне нравится синтаксис

DT[c("a","b")]
14 голосов
/ 14 декабря 2011

Использование оператора %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

РЕДАКТИРОВАТЬ: Добавление опции Фаррел

Обратите внимание, что это на другом компьютере, но относительные неровности те же.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...