Buscar índices de filas duplicadas [duplicar]

Resuelto annndrey asked hace 54 años • 2 respuestas

La función duplicada en R realiza búsqueda de filas duplicadas. Si queremos eliminar los duplicados, solo necesitamos escribir df[!duplicated(df),]y los duplicados se eliminarán del marco de datos.

¿Pero cómo encontrar los índices de datos duplicados? Si duplicateddevuelve VERDADERO en alguna fila, significa que esta es la segunda aparición de dicha fila en el marco de datos y su índice se puede obtener fácilmente. ¿Cómo obtener el índice de primera aparición de esta fila? O, en otras palabras, ¿un índice con el que la fila duplicada es idéntica?

Podría hacer un bucle en data.frame, pero creo que hay una respuesta más elegante a esta pregunta.

annndrey avatar Jan 01 '70 08:01 annndrey
Aceptado

He aquí un ejemplo:

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

duplicated(df) | duplicated(df, fromLast = TRUE)
#[1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE

¿Cómo funciona?

La función duplicated(df)determina elementos duplicados en los datos originales. El fromLast = TRUEindica que "la duplicación debe considerarse desde el reverso". Los dos vectores lógicos resultantes se combinan usando |ya que a TRUEen al menos uno de ellos indica un valor duplicado.

Sven Hohenstein avatar Sep 19 '2012 13:09 Sven Hohenstein

Si está utilizando una tabla de datos con clave , puede utilizar la siguiente sintaxis elegante

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]

para desempacar

  • DT[duplicated(DT)]subconjuntos de aquellas filas que están duplicadas.

  • unique(...)devuelve sólo las combinaciones únicas de las filas duplicadas. Esto se ocupa de cualquier caso con más de 1 duplicado (duplicados duplicados, por ejemplo, triplicados, etc.)

  • DT[..., which = T] fusiona las filas duplicadas con el original, which=Tdevolviendo el número de fila (sin which = Tél, solo devolvería los datos).

También podrías usar

 DT[,count := .N,by = list(A,B,C)][count>1, which=T]
mnel avatar Sep 24 '2012 00:09 mnel