我正在尝试对我不想修改的现有数据表对象进行一些简单的过滤。我注意到它似乎比基本 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/