【发布时间】:2018-10-22 21:11:19
【问题描述】:
我有一个用例,我想快速重复过滤数据表。我有一种感觉,如果我使用像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))
我想做的情况是为val > tol 找到唯一的id。使用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
【问题讨论】:
-
别忘了使用
set.seed比较随机数据。 -
如果您实际使用 data.table 语法(您在这里没有这样做),则会发生很多内部优化(包括排序)。尝试类似 d[val>=0.1, uniqueN(id)]。
-
你应该研究 data.table 小插曲。他们做了很多工作,他们非常出色。如果您阅读文档,则不必依赖自己的感觉。
-
原来
length(unique(...))比uniqueN快 -
绝对不应该这样。目前无法测试。也许我明天会看看。此外,您确实应该设置种子或使用副本来创建相同的 data.tables。
标签: r data.table subset