通过匹配另一个 data.table 的列来子集 data.table

Subset a data.table by matching columns of another data.table

我一直在寻找一种解决方案,用于使用另一个数据 table 中某些列的匹配值对数据 table 进行子集化。

示例如下:

set.seed(2)

dt <- 
        data.table(a = 1:10, 
                   b = rnorm(10), 
                   c = runif(10), 
                   d = letters[1:10])

dt2 <- 
        data.table(a = 5:20, 
                   b = rnorm(16), 
                   c = runif(16), 
                   d = letters[5:20])

这是我需要的结果:

> dt2

 1:  5 -2.311069085 0.62512173 e
 2:  6  0.878604581 0.26030004 f
 3:  7  0.035806718 0.85907312 g
 4:  8  1.012828692 0.43748800 h
 5:  9  0.432265155 0.38814476 i
 6: 10  2.090819205 0.46150111 j

我从第二个数据返回的行 table 其中 a 和 d 匹配,即使 b 和 c 可能不匹配。真实数据是互斥的,我需要匹配三列。

我们可以使用 %in% 相应地匹配列和子集。

dt2[a %in% dt$a & d %in% dt$d]
#    a           b         c d
#1:  5 -2.31106908 0.6251217 e
#2:  6  0.87860458 0.2603000 f
#3:  7  0.03580672 0.8590731 g
#4:  8  1.01282869 0.4374880 h
#5:  9  0.43226515 0.3881448 i
#6: 10  2.09081921 0.4615011 j

这是一个使用连接并指定 on

的选项
na.omit(dt2[dt[, c("a", "d"), with = FALSE], on = c("a", "d")])
#    a           b         c d
#1:  5 -2.31106908 0.6251217 e
#2:  6  0.87860458 0.2603000 f
#3:  7  0.03580672 0.8590731 g
#4:  8  1.01282869 0.4374880 h
#5:  9  0.43226515 0.3881448 i
#6: 10  2.09081921 0.4615011 j