Mam taką ramkę danych -
set.seed(123)
df = data.frame(x=sample(0:1,10,replace=T),y=sample(0:1,10,replace=T),z=1:10)
> df
x y z
1 0 1 1
2 1 0 2
3 0 1 3
4 1 1 4
5 1 0 5
6 0 1 6
7 1 0 7
8 1 0 8
9 1 0 9
10 0 1 10
Chciałbym usunąć zduplikowane wiersze na podstawie pierwszych dwóch kolumn. Oczekiwany wynik -
df[!duplicated(df[,1:2]),]
x y z
1 0 1 1
2 1 0 2
4 1 1 4
Szukam konkretnie rozwiązania wykorzystującego dplyr
pakiet.
df %>% group_by(x, y) %>% do(head(.,1))
distinct()
Oto rozwiązanie wykorzystujące
dplyr >= 0.5
.źródło
Ze względu na kompletność działają również następujące zasady:
Jednak wolę rozwiązanie z użyciem
distinct
i podejrzewam, że jest też szybsze.źródło
W większości przypadków najlepszym rozwiązaniem jest użycie
distinct()
firmy dplyr, jak już zostało zasugerowane.Jednak tutaj jest inne podejście, które wykorzystuje
slice()
funkcję z dplyr.Różnica w porównaniu z używaniem
distinct()
funkcjiZaletą tego rozwiązania jest to, że wyraźnie określa, które wiersze są zachowywane z oryginalnej ramki danych, i można je ładnie łączyć z
arrange()
funkcją.Załóżmy, że masz dane dotyczące sprzedaży klientów i chcesz zachować jeden rekord dla każdego klienta i chcesz, aby był to rekord z ostatniego zakupu. Wtedy możesz napisać:
źródło
Wybierając kolumny w R dla zredukowanego zestawu danych, często możesz skończyć z duplikatami.
Te dwie linie dają ten sam wynik. Każdy generuje unikalny zestaw danych z tylko dwiema wybranymi kolumnami:
źródło
Jeśli chcesz znaleźć zduplikowane wiersze, możesz użyć
find_duplicates
zhablar
:źródło