【发布时间】:2018-12-13 14:06:09
【问题描述】:
我正在尝试在 R 中使用data.table 来使用大于和小于这样的有效子集:
library(data.table)
x = runif(10000, min = 1, max = 2)
rowname = seq(10000)
min.x = x - 0.0001
max.x = x + 0.0001
table = data.table(rowname, min.x, max.x)
system.time(x.candidates <- lapply(x, function(x) {table[x > min.x & x < max.x, rowname]}))
# -> user system elapsed
# 4.87 0.00 4.90
table2 = data.table(rowname, min.x, max.x)
setindex(table2, min.x)
setindex(table2, max.x)
system.time(x.candidates2 <- lapply(x, function(x) {table2[x > min.x & x < max.x, rowname]}))
# -> user system elapsed
# 4.90 0.00 4.92
table3 = data.frame(rowname, min.x, max.x)
system.time(x.candidates3 <- lapply(x, function(x) {table3[x > table3$min.x & x < table3$max.x, "rowname"]}))
# -> user system elapsed
# 1.77 0.00 1.78
但是,我发现设置索引时没有加速,data.frame 甚至更快。是否有可能在 data.table 或 R 中编写更高效的代码?
最佳解决方案
正如@eddi 指出的,这是使用 .EACHI 的正确方法:
table4 = data.table(rowname, min.x, max.x)
system.time(x.candidates4 <- table4[data.table(x), on = .(min.x < x, max.x > x), list(rowname = list(rowname)), by = .EACHI])
# user system elapsed
# 0.02 0.00 0.01
【问题讨论】:
-
有什么理由为此使用 lapply 吗?你不能简单地使用 dplyr 的 filter() 吗?不确定这是否更有效
-
我愿意使用任何包,但我读到 data.table 是最有效的。
-
data.table 可能是存储/获取数据的最有效方式,但您的减速可能在实际 lapply 中,这与 data.table 无关。
标签: r data.table