2015-05-14 2 views
1

Иногда у меня есть ключ data.table, который я бы хотел подмножить в соответствии с его ключом и не включенным столбцом. Каков самый простой или быстрый способ сделать это?Объединение векторного и двоичного поиска в data.table

Что чувствует себя наиболее естественным является ошибкой:

dt <- data.table(id = 1:100, var = rnorm(100), key = "id") 
dt[.(seq(1, 100, 2)) & var > 0, ] 

Следующая чистейшая вещь в цепи:

dt[.(seq(1, 100, 2))][var > 0, ] 

И, конечно, мы можем угробить используя бинарный поиск на всех (я думаю, что это очевидно, следует избегать):

dt[id %in% seq(1, 100, 2) & var > 0, ] 

Есть ли подход, который мне не хватает? Кроме того, любая конкретная причина, по которой первая является ошибкой? Синтаксис кажется мне достаточно ясным.

+0

Я делаю ставку на «чистую» цепочку. Если ваше второе условие является неравенством, я сомневаюсь, что текущая система индексирования может помочь. В настоящее время в условиях равенства есть «автоматическая индексация», но я не уверен в деталях. Он упоминается в новостях: https://github.com/Rdatatable/data.table Если вам нужно сделать 'by = .EACHI' с вашим подмножеством, вам придется переключать цепочку вокруг, я думаю. 'dt [var> 2] [. (seq (1,100,2)), ... do stuff ..., by = .EACHI]' – Frank

+2

см. комментарии [здесь] (http://stackoverflow.com/a/ 29668066/817778) – eddi

+0

так кажется, что ответ действительно зависит от того, что я хочу сделать в 'j', это безопасно сказать? – MichaelChirico

ответ

0

это письмо, нативный способ сделать:

dt[.(seq(1, 100, 2)) & var > 0, j] #some expression j 

является следующее:

dt[.(seq(1, 100, 2)), .SD[var > 0, j]] 

Чем больше я работаю с data.table, тем более естественно, что это, но она по-прежнему выглядит немного неинтуитивно. Такова жизнь.

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