2016-03-21 31 views
0

Başka bir veri tablosunda belirli sütunlar için eşleşen değerleri kullanarak bir veri tablosunu alt etmek için bir çözüm arıyordum. Bu ihtiyacım sonucuBaşka bir data.table sütununu eşleştirerek data.table alt kümesini silebilir

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]) 

: Burada

örnekte I satırları, ikinci veri tablosu döndü

> 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 

burada a ve d eşleme da b olsa ve c olmayabilir. Gerçek veriler karşılıklı olarak münhasırdır ve üç sütun üzerinde eşleşmem gerekiyor.

+1

sen on' 'ile join'' denediniz belirterek bir seçenektir. BTW, lütfen birleştirme denedim 'set.seed' – akrun

+0

@akrun kullanarak örnek tekrar üretilebilir, ancak eşleşen olmayan herhangi bir satır tutmadan tüm maçları tutmak için emin olmak istiyorum. – dc3

+0

@ dc3 bu set.seed (2) 'ile beklenen çıktı olduğundan emin misiniz? – mtoto

cevap

2

Sütunları ve alt kümeleri uygun şekilde eşleştirmek için %in%'u kullanabiliriz.

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

İşte katılmak kullanarak ve 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 bu “nomatch” ile temiz bir şekilde yapılabilir. OP'in Q. – Arun

İlgili konular