r - 对于这些查找表样式查询,为什么 data.table 比基本 R 慢?

标签 r data.table

我正在尝试对我不想修改的现有数据表对象进行一些简单的过滤。我注意到它似乎比基本 R 等效项慢得多,如以下示例所示:

library(data.table)
dt <- data.table(
  label = sample(c("l1", "l2", "l3"), 300, replace = TRUE),
  x = rnorm(300)
)
df <- as.data.frame(dt)
all.equal(dt[label == "l3", x], df[df$label == "l3", "x"])

(bench <- microbenchmark::microbenchmark(
  dt_lookup = dt[label == "l3", x],
  df_lookup = df[df$label == "l3", "x"],
  mixed = dt[dt$label == "l3", "x"],
  times = 1000
))

产生

Unit: microseconds
      expr    min     lq      mean median     uq    max neval
 dt_lookup 1159.2 1393.0 1529.4477 1451.6 1524.2 6487.9  1000
 df_lookup   17.3   25.2   33.8164   32.0   36.4  150.4  1000
     mixed  140.9  175.2  204.8512  193.9  220.7 1533.9  1000

也就是说,base R 的速度快了 30 倍以上。

我在这里做错了什么吗?在这种情况下,索引和键似乎对性能没有太大影响。

最佳答案

可以先使用 [[ 提取列,然后对行进行子集化,而不是对 data.frame 进行子集化

df[["x"]][df[["label"]] == "l3"]

关于r - 对于这些查找表样式查询,为什么 data.table 比基本 R 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59094911/

相关文章:

r - 将ggplot2与名称中带有空格的列一起使用

r - 右转

r - 为连续运行的值创建索引

r - 用整数矩阵子集data.frame

r - h2o.predict() 在新测试集上使用哪个阈值?

r - 使用 dot dot dot (...) 表示从自定义函数返回的列,用于 data.table 对象

R - 如何为唯一组序列的缺失值添加行?

r - 当表通过选择列为 ("index"时,data.table 中的辅助键 "copied"属性会丢失

r - 有没有技巧可以将列表保存到 R data.table 中的单元格中?

r - 错误: package or namespace load failed for ggplot2 and for data.table