2011-12-14 9 views
21

Предположим, у меня есть таблица data.table, и я хочу выбрать все строки, где переменная x имеет значение b. Это легкоКак выбрать строки по двум критериям в data.table в R

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"] 

Кстати, оказалось, что один должен установить ключ, если ключ не установлен в х, то это не работает. Кстати, что произойдет, если я установил два столбца в качестве ключей?

Во всяком случае, двигаясь, позволяет сказать, что я хочу, чтобы выбрать все строки, в которых переменная х была или б

DT["b"|"a"] 

не работает

Но следующие работы

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

Но это использует векторное сканирование a la data frames. Он не использует двоичный поиск. Думаю, для небольших наборов данных это не имеет значения.

Это то, что я должен делать, или я не знаю синтаксиса data.table?

И еще одно. Существуют ли примеры более сложных логических процедур множественного выбора (или подмножества) с data.table?

Я знаю, что всегда мог вернуться к использованию функции subset(), так как data.table будет вести себя как data.frame, если это необходимо.

+2

Подробный обработанный пример многоколоночного ключа представлен во встроенной виньетке. –

+2

И не уверен, насколько хорошо известно, что нужно работать через результат 'example (data.table)' в командной строке - есть примеры. –

ответ

13

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

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

Я добавил это к эталону ниже, он выполняет самые быстрые из трех решений. Хорошая работа. – Chase

+1

Отлично. Это называется _by, но не by_, a.k.a._группировка 'i'_. Совпадает с _having_ в SQL. –

+3

Когда вы получаете зависание группировки 'i', следующим шагом обучения является _join унаследованная область_. Выполнить 'example (data.table)' и результаты показывают пример. –

13

Использование команды %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 

EDIT: Добавление опции Фаррела

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

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 

 Смежные вопросы

  • Нет связанных вопросов^_^