2014-11-14 3 views
1

У меня есть следующие data.table:Фильтр data.table по нескольким критериям в том же столбце

> dt= data.table(num=c(1,2,1,1,2, 3, 3,2), letters[1:8]) 
> dt 
    num V2 
1: 1 a 
2: 1 c 
3: 1 d 
4: 2 b 
5: 2 e 
6: 2 h 
7: 3 f 
8: 3 g 

Я хочу, чтобы фильтровать все Num равен 1 и 2 и получить в результате data.table. Я могу сделать это с помощью:

> dt[num==1 | num==2,] 
    num V2 
1: 1 a 
2: 1 c 
3: 1 d 
4: 2 b 
5: 2 e 
6: 2 h 

Или:

rbind(setkey(dt, num)[J(1)],setkey(dt, num)[J(2)]) 

Но есть ли вариант с SetKey так, что второе выражение короче, как:

setkey(dt, num)[1|2] 

Поскольку SetKey код быстрее для очень большого количества ... Я был бы признателен за помощь!

+1

Как этот 'setkey (dt, num) [num% in% c (1,2)]'? – KFB

ответ

0

В добавок к комментарий KFB в:

setkey(dt, num)[num %in% c(1,2)] 

Если значения фильтрации являются целыми числами в последовательности:

setkey(dt,num)[J(1:2)] # OR 
setkey(dt,num)[seq] 

Если они произвольны:

setkey(dt,num)[J(c(1,2)]  

Примечание 1: Это может не работать в более старых версиях data.table ПРИМЕЧАНИЕ 2: . является псевдонимом для J который является более удобным для чтения:

setkey(dt,num)[.(1:2)] 

FWIW, мне нравится, используя magrittr пакет с data.table и сделать все ясно, насколько это возможно:

dt %>% setkey(num) 
dt[ .(1:2) ] 

Недостаток заключается в том, что вы можете» t делайте это аккуратно на одной линии.

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