2013-10-10 4 views
0

У меня есть две большие таблицы с несколькими полями (но с разными именами полей). Каким будет самый простой/быстрый способ найти (и удалить) такие общие записи?найти (и удалить) общие записи между двумя таблицами (data.table)

К примеру, у меня есть

set.seed(2) 
dt1 <- data.table(dt1field1=1:9, dt1field2=LETTERS[runif(9,1,5)], dt1field3=letters[runif(9,12,15)]) 
dt2 <- data.table(dt2field1=1:10, dt2fieldB=LETTERS[runif(10,1,5)], dt2fieldC=letters[runif(10,12,15)]) 

(извините за тупое наполнение)

Что бы data.table синтаксиса, чтобы найти все записи, в которых t1field2=t2fieldB И t1field3=t2fieldC? (ОК, если это необходимо, я могу сначала переименовать поля, чтобы иметь равные имена для сравниваемых полей)

Большое спасибо!

ответ

2

Если это работает, чтобы иметь одну таблицу с только уникальные значения:

setkeyv(dt1, names(dt1)[2:3]) 
setkeyv(dt2, names(dt2)[2:3]) 
dt2[dt1, allow.cartesian=TRUE] 

В противном случае, я думаю,

dt2[!dt1, allow.cartesian=TRUE] 

будет работать для каждого индивидуальная таблица.

+0

благодарит за ответ! Я немного изменил пример, и теперь кажется, что ваш первый код дает не только уникальные значения, но и все записи из dt1 PLUS те записи из dt2, которые имеют одинаковые значения ... –

+0

Это хороший момент - я не понял что. Вы можете придерживаться второй части ответа, или добавить '[! Is.na (dtfield1)]' до конца. –

3

Что-то вдоль этих линий -

setkeyv(dt1,c('dt1field2','dt1field3')) 
setkeyv(dt2,c('dt2fieldB','dt2fieldC')) 
dt2[dt1, allow.cartesian = TRUE] 
+0

Результаты по ошибке. –

+0

Размещено соглашение об именах, исправлено. – TheComeOnMan

+1

Вам нужно 'allow.cartesian', если таблица будет длиннее самой длинной из двух таблиц. –

Смежные вопросы