Znajdź indeksy zduplikowanych wierszy [duplicate]
To pytanie ma już odpowiedź tutaj:
- znajdowanie wszystkich zduplikowanych wierszy, w tym "elementów o mniejszych indeksach dolnych" 3 odpowiedzi
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?
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ść.
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, awhich=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]
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