通过匹配另一个data.table的列来设置data.table

时间:2016-03-21 13:55:14

标签: r data.table subset

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

以下是示例:

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

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

2 个答案:

答案 0 :(得分:2)

我们可以使用%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

答案 1 :(得分:1)

以下是使用加入并指定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