繁体   English   中英

R:%in% 对比 inner_join

[英]R: %in% vs inner_join

我正在处理的问题是表 A 中的 select 行(总共 N 行,很多列)如果值为 %in% 表 B(总共 K 行,仅 1 列)。 这里 N ~ 1 bn >> K ~ 100k

我想知道我是否应该只 select 行:

sub_set = df_A[df_A$Key %in% df_B$Key,]

或者我应该利用一些 inner_join 或合并 function:

sub_set = df_A %>% inner_join(df_B, by="Key")

当 N 很大时?

让我们生成 100 万行样本数据并对这两种方法进行基准测试:

df_A <- data.frame(key = sample(letters, size = 1e6, replace = T), val = rnorm(1e6))
df_B <- data.frame(key = letters[1:10])

library(microbenchmark)
library(tidyverse)

microbenchmark(
  df_A[df_A$key %in% df_B$key, ], 
  inner_join(df_A, df_B, by = 'key'),
  times = 1000
)

Unit: milliseconds
                               expr      min       lq     mean   median       uq      max
     df_A[df_A$key %in% df_B$key, ] 25.91352 27.57424 32.74825 28.08004 36.96685 158.8774
 inner_join(df_A, df_B, by = "key") 46.75017 48.29013 53.95744 48.63215 57.25996 164.4909
 neval
  1000
  1000

注意中值基准。 看起来%in%结合逻辑索引比dplyr::inner_join更快。

在某些情况下,您可能会发现 data.table 连接方法非常快

library(data.table)
setDT(df_A)[setDT(df_B), on=.(key)]

使用 jdobres nice benchmarking example,我发现这比%in%方法快两倍

Unit: milliseconds
                               expr     min       lq     mean   median       uq      max neval
     df_A[df_A$key %in% df_B$key, ] 27.3338 27.91770 37.03861 28.47005 41.30420 309.4625   100
 inner_join(df_A, df_B, by = "key") 64.7635 66.39085 77.59911 67.94265 89.34715 347.9862   100
            df_A[df_B, on = .(key)] 11.6840 12.24055 15.45660 12.59900 13.30475  41.5436   100

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM