【发布时间】:2013-11-24 15:43:28
【问题描述】:
有人可以帮我评估一下使用 data.table 的数据框大小对搜索来说更快吗?在我的用例中,数据框将是 24,000 行和 560,000 行。总是挑选出 40 行的块以供进一步使用。
示例: DF 是一个 120 行 7 列(x1 到 x7)的数据框; "string" 占据 x1 的前 40 行。
DF2 是 DF 的 1000 倍 => 120,000 行
DF data.table 的大小比较慢,DF2 的大小比较快。
代码:
> DT <- data.table(DF)
> setkey(DT, x1)
>
> DT2 <- data.table(DF2)
> setkey(DT2, x1)
>
> microbenchmark(DF[DF$x1=="string", ], unit="us")
Unit: microseconds
expr min lq median uq max neval
DF[DF$x1 == "string", ] 282.578 290.8895 297.0005 304.5785 2394.09 100
> microbenchmark(DT[.("string")], unit="us")
Unit: microseconds
expr min lq median uq max neval
DT[.("string")] 1473.512 1500.889 1536.09 1709.89 6727.113 100
>
>
> microbenchmark(DF2[DF2$x1=="string", ], unit="us")
Unit: microseconds
expr min lq median uq max neval
DF2[DF2$x1 == "string", ] 31090.4 34694.74 35537.58 36567.18 61230.41 100
> microbenchmark(DT2[.("string")], unit="us")
Unit: microseconds
expr min lq median uq max neval
DT2[.("string")] 1327.334 1350.801 1391.134 1457.378 8440.668 100
【问题讨论】:
-
+1。也许只是使用 data.table 但对其应用不同的子集函数,从列表
methods(`[`)中选择?此外,如果您想要一个实质性的答案,您可能需要为 DF 和 DF2 创建示例数据 -
@Frank:我尝试了 subset(DT2[.("string")]) ,它有点慢。这就是你的想法吗? DF 数据:x1:字符串,40 行始终相同,x2:字符串,x3 到 x7:日期。 DF2 只是 DF 复制了 1000 次。我需要选择具有相同字符串的 40 行。
-
我在想,如果你的数据太小以至于 data.frame 子集是合适的,你总是可以做
`[.data.frame`(DT,DT$x1=="string")或类似的事情,并将你的数据保存在 data.table 中。另外,如果x1=="string"为前 40 行,您应该只选择前 40 行,对吗? -
如果“字符串”在前 40 行中,我猜 data.frame(执行行搜索)将具有类似于 data.table 的性能......你应该做一些更随机的事情......
标签: r data.table