Znajdź indeksy zduplikowanych wierszy [duplicate]

To pytanie ma już odpowiedź tutaj:

Funkcja duplikowana w R wykonuje wyszukiwanie duplikatów wierszy. Jeśli chcemy usunąć duplikaty, wystarczy napisać df[!duplicated(df),] i duplikaty zostaną usunięte z ramki danych.

Ale jak znaleźć indeksy zduplikowane dane? Jeżeli duplicated zwraca TRUE w jakimś wierszu, to znaczy, że jest to drugie wystąpienie takiego wiersza w ramce danych i jego indeks można łatwo uzyskać. Jak uzyskać indeks pierwszego wystąpienia tego wiersza? Czy innymi słowy Indeks, z którym powielony wiersz jest identyczny?

Mógłbym zrobić pętlę na danych.ramka, ale myślę, że jest bardziej elegancka odpowiedź na to pytanie.
Author: Uwe, 2012-09-19

2 answers

To zwraca logiczny wektor indeksowy:

duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1]

Oto przykład:

df <- data.frame(a = c(1,2,3,4,1,5,6,4,2,1))

duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1]
#[1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE

which(duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1])
#[1]  1  2  4  5  8  9 10

Aktualizacja (na podstawie komentarza):
Złożoność polecenia może zostać zmniejszona, jeśli fromLast = TRUE jest użyta jako argument funkcji. Jest to łatwiejsze niż tworzenie dwóch odwróconych wektorów.

duplicated(df) | duplicated(df, fromLast = TRUE)

duplicated(df) | duplicated(df, fromLast = TRUE)
#[1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE
Jak to działa?

Funkcja duplicated jest stosowana zarówno do oryginalnej ramki danych, jak i ramki danych z odwróconą kolejnością wierszy. Wyjście tego ostatniego jest ponownie odwrócone. Zauważ, że pierwszy wystąpienia zduplikowanych wartości w oryginalnych danych są ostatnimi wystąpieniami w odwróconej wersji. Następnie oba wektory są łączone za pomocą |, ponieważ TRUE w co najmniej jednym z nich oznacza zduplikowaną wartość.

 77
Author: Sven Hohenstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-02 03:20:30

Jeśli używasz z kluczem danych.table, wtedy można użyć następującej składni

library(data.table)
DT <- data.table(A = rep(1:3, each=4), 
                 B = rep(1:4, each=3), 
                 C = rep(1:2, 6), key = "A,B,C")

DT[unique(DT[duplicated(DT)]),which=T]

Do rozpakowania

  • DT[duplicated(DT)] podzbiory tych wierszy, które są duplikatami.

  • unique(...) zwraca tylko unikalne kombinacje zduplikowanych wierszy. Dotyczy to wszystkich przypadków z więcej niż 1 duplikat (duplikaty duplikatów np triplikaty itp)

  • DT[..., which = T] Scala zduplikowane wiersze z oryginałem, a which=T Zwraca numer wiersza (bez {[6] } po prostu zwróci dane).

Możesz również użyć

 DT[,count := .N,by = list(A,B,C)][count>1, which=T]
 15
Author: mnel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 00:20:22