2016-03-21 2 views
0

Я искал решение для подмножества таблицы данных, используя соответствующие значения для определенных столбцов в другой таблице данных.Подмножество data.table путем сопоставления столбцов другой data.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 

где я строка вернулся из второй таблицы данных, где а и д матч, даже если б и c не может. Реальные данные являются взаимоисключающими, и мне нужно сопоставлять три столбца.

+1

Вы пробовали '' join' с on'. BTW, пожалуйста, сделайте свой пример воспроизводимым, используя 'set.seed' – akrun

+0

@akrun. Я попытался слить, но я хочу быть уверенным, что все совпадения не будут содержать никаких несоответствующих строк. – dc3

+0

@ dc3 вы уверены, что это ожидаемый результат с помощью 'set.seed (2)'? – mtoto

ответ

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

Вот вариант с использованием соединения и указав 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 
+4

IIUC это можно сделать с помощью 'nomatch'. См. Комментарий под Q. – Arun