У меня проблема с получением подмножества в data.table для быстрого запуска. Предположим, у нас есть набор данных со столбцом «keyCol», и мы хотим подмножество, где keyCol == 2. Как я понимаю, как правило, наиболее эффективным подмножеством является что-то вроде:
setkey(dt, keyCol)
dt[.(2)]
Это метод бинарного поиска по ключам, для которого data.table действительно хорош. Но как мне реализовать это для неравенства? Есть ли способ ключа таблицы, чтобы поиск неравенства мог быть таким же эффективным, как поиск равенства? Если мы хотели, например, подмножество, где keyCol> 4:
dt[keyCol > 4]
.... но это не достаточно быстро для моих целей. Так есть ли способ сделать это? Или я в корне неправильно понимаю природу ключевого бинарного поиска? Любой вклад был бы великолепен.
Спасибо
РЕДАКТИРОВАТЬ: Точная проблема, которую я пытаюсь решить, заключается в следующем. У меня есть набор данных со столбцами Date, id и group., Я пытаюсь найти, сколько из группы изменений id за некоторый горизонт дат. Поэтому мои данные для определенного идентификатора выглядят так:
Date id Group
2018-01-01 A 1
2018-02-01 A 2
2018-03-01 A 1
2018-04-01 A 3
2018-05-01 A 5
2018-06-01 A 1
Я хочу найти старую группу, в которой они находились, с некоторой переменной «lag» назад, поэтому я создаю новый столбец с именем oldGroup:
dt[, oldGroup := Group - c(rep(NA, lag), diff(Group, lag = lag)), id]
Таким образом, если задержка равна 1 (т.е. мы хотим знать группу с 1 периода назад, мы получили бы:
Date id Group oldGroup
2018-01-01 A 1 NA
2018-02-01 A 2 1
2018-03-01 A 1 2
2018-04-01 A 3 1
2018-05-01 A 5 3
2018-06-01 A 1 5
Проблема в том, что есть некоторые идентификаторы, у которых меньше точек данных, чем у параметра задержки. Другими словами, может быть только 5 точек данных, но мы хотим, чтобы лаг = 6. Это приведет к ошибке во время назначения oldGroup. Для решения этой проблемы я заранее использую неравенство:
dt[, occurences := .N, id]
dt <- dt[occurences > lag]
Таким образом, никаких ошибок не возникает, но подмножество занимает более секунды, что, хотя и не очень долго, я бы хотел сделать быстрее.
Надеюсь, это объясняет проблему. Извините за стену текста.