Soru Veri çerçevesinin tamamlayıcısı bulun (anti-join)


İki veri çerçevem ​​var (df ve df1). df1, df'nin alt kümesidir. Ben df1 'in tamamlayıcısı olan bir veri çerçevesini almak istiyorum, diğer bir deyişle, ikincisiyle eşleşmeyen birinci veri kümesinin geri dönüş sıraları. Örneğin,

veri çerçevesi df:

heads
row1
row2
row3
row4
row5

veri çerçevesi df1:

heads
row3
row5

Ardından istenen çıktı df2:

heads
row1
row2
row4

19
2018-02-24 17:59


Menşei




Cevaplar:


Deneyin anti_join itibaren dplyr

library(dplyr)
anti_join(df, df1, by='heads')

24
2018-02-24 18:02



çok teşekkürler akrun. Çok iyi çalıştı. - oercim
@oercim size yardımcı olmaktan memnun. - akrun


Ayrıca bir tür anti karışma da yapabilirsiniz data.tables ikili üye

library(data.table)
setkey(setDT(df), heads)[!df1]
#    heads
# 1:  row1
# 2:  row2
# 3:  row4

DÜZENLE: Başlangıç ​​verileri. v1.9.6 + kullanırken anahtarları ayarlamadan data.tables'e katılabiliriz on

setDT(df)[!df1, on = "heads"]

EDIT2: Başlangıç ​​verileri. v1.9.8 +  fsetdiff temel olarak yukarıdaki çözümün bir varyasyonu olan tanıtıldı. x data.table, ör. x[!y, on = names(x)]. Eğer all ayarlanır FALSE (varsayılan davranış), daha sonra yalnızca benzersiz satırlar x iade edilecek. Her bir data.tab içinde sadece bir sütun olması durumunda, aşağıdaki çözümler önceki çözümlere denk olacaktır.

fsetdiff(df, df1, all = TRUE)

40
2018-02-24 18:07





Deneyin %in% komutu verin ve ile tersine çevirin !

df[!df$heads %in% df1$heads,]

12
2018-02-24 18:03



Baz R çözümüne başvurunuz, burada en hızlı olanı olmasa da. - bartektartanus
Bir anti birleştirme yapmak ve mulitple anahtar / sütunlarım varsa, sözdizimi nasıl görünür? - Blind0ne


Başka bir seçenek, taban R'yi ve setdiff fonksiyon:

df2 <- data.frame(heads = setdiff(df$heads, df1$heads))

setdiff tam olarak hayal edeceğiniz gibi çalışır; her iki argümanı da set olarak alın ve ikincisindeki tüm öğeleri ilkinden kaldırın.

buldum setdiff daha okunabilir tahtn %in% ve onlara ihtiyaç duymadığım zamanlarda ek kütüphaneler gerektirmemeyi tercih ederim, fakat kullandığınız cevap büyük ölçüde kişisel bir zevk meselesidir.


6
2018-02-24 18:08



setdiff ve %in% hemen hemen aynı fonksiyon. - David Arenburg
@ DavidArenburg-kabul, bu yüzden bu sadece bir okunaklılık ve tat meselesi olduğunu düşünüyorum. - Joe
@DavidArenburg, ve bu işlev match. - Marat Talipov
@MaratTalipov Biliyorum, bu benim ima ettiğim şey - David Arenburg


dplyr ayrıca setdiff() seni alacak

enter image description here

setdiff(bigFrame, smallFrame) İlk tablodaki ekstra kayıtları alır.

OP'nin örneği için kod okuyacaktır setdiff(df, df1)

dplyr bir çok harika işleve sahiptir: hızlı ve kolay bir kılavuz için bkz. İşte.


4
2017-11-10 03:47





Bir fonksiyon yaratarak başka bir seçenek negate_match_df kodu manipüle ederek match_df arasında plyr paketi.

library(plyr)
negate_match_df <- function (x, y, on = NULL) 
{
if (is.null(on)) {
    on <- intersect(names(x), names(y))
    message("Matching on: ", paste(on, collapse = ", "))
}
keys <- join.keys(x, y, on)
x[!keys$x %in% keys$y, , drop = FALSE]
}

Veri

df <- read.table(text ="heads
row1
row2
row3
row4
row5",header=TRUE)

df1 <- read.table(text ="heads
row3
row5",header=TRUE)

Çıktı

negate_match_df(df,df1)

1
2018-06-28 14:55