У меня есть случай, когда я хочу быстро фильтровать таблицы данных повторно.У меня такое ощущение, что если я использую простой фильтр, такой как df[val>0,]
, сканирование будет O(N)
, но если я просто установлю поле val
в качестве ключа, то я смогу фильтровать быстрее, но не уверен, как это сделать.В качестве примера я сделал следующее:
отсортированный data.table
df_sort = data.table(id = seq(1, 100000), val = runif(100000, 0, 1))
setkeyv(df_sort, c('val')
обычный data.table
df = data.table(id = seq(1, 100000), val = runif(100000, 0, 1))
Случай, который я хочу сделать:найти уникальные id
для val > tol
.Используя rbenchmark
я сделал следующее
benchmark('raw' = { l = length(unique(df$id[df$val >=0.1]))}, 'sort' = {l = length(unique(df_sort$id[df_sort$val >=0.1]))}, replications=20)
результат, который я получил, не показал разницы между ними.
test replications elapsed relative user.self sys.self user.child sys.child
1 raw 20 0.440 1.005 0.494 0 0 0
2 sort 20 0.438 1.000 0.540 0 0 0
Может ли кто-нибудь дать несколько советов о том, как этого добиться?Это вообще возможно?
РЕДАКТИРОВАТЬ
Попробовал предложение в комментарии, вернулся хуже.Не уверен почему.
benchmark('raw' = { l = df[val >=0.1, uniqueN(id)]}, 'sort' = {l = df_sort[val >=0.1, uniqueN(id)]}, replications=200)
test replications elapsed relative user.self sys.self user.child sys.child
1 raw 200 0.770 1.000 0.928 0 0 0
2 sort 200 1.361 1.768 1.691 0 0 0