2015-06-11 13 views
9

Mam data.frame z dwiema zmiennymi id.x i id.y, których kombinacja jednoznacznie identyfikuje każdy wiersz, ale są one wielokrotnie powtarzane w zbiorze danych.Połączyć group_by i odrębny

ja jak używać dplyr do group_byid.xid.x tak, że każda jest dopasowana do odrębnego id.y.

edit edytowany przykład podkreślić różną liczbę uniqueid.x. i id.y

przykład:

id.x id.y 
    a o 
    a p 
    a q 
    c o 
    c p 
    c q 

wróci:

id.x id.y 
    a o 
    c q 

dput na przykład:

structure(list(id.x = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("a", 
"c"), class = "factor"), id.y = structure(c(1L, 2L, 3L, 1L, 2L, 
3L), .Label = c("o", "p", "q"), class = "factor")), .Names = c("id.x", 
"id.y"), row.names = c(NA, -6L), class = "data.frame") 

edit Jeśli mój pożądany rezultat można osiągnąć bez użycia group_by lub distinct że też jest w porządku! Używam również data.table, a rozwiązanie data.table byłoby w porządku.

+0

Jak chcesz chcą do 'mecze' należy zdefiniować? Nie ma żadnego "wyraźnego" połączenia, które mogłoby stworzyć pożądany rezultat. – cdeterman

+0

Chciałbym, aby dopasowania były zdefiniowane w taki sposób, aby maksymalna liczba "różnych" identyfikatorów id.x i "id.y" w ostatecznym 'data.frame' podlegała wartości' length (unique (id.x)) == length (unique (id.y)) == nrow (data.frame) '. Czy to ma sens? – bjoseph

+1

Nie jestem pewien, ale co powiesz na 'library (data.table); setDT (df) [, lapply (.SD, unique)]? –

Odpowiedz

1

Korzystanie dplyr

df %>% filter(dense_rank(id.x)==dense_rank(id.y)) 

która zwraca

id.x id.y 
1 a o 
2 c p