valores una resaltar repetidos para hojas formato filas duplicados duplicadas datos condicional columnas columna buscar r duplicates dataframe

una - Buscar índices de filas duplicadas



resaltar filas duplicadas en excel (2)

La función duplicada en R realiza una búsqueda de fila duplicada. 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 duplicated devuelve TRUE en alguna fila, significa que esta es la segunda ocurrencia 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 ciclo en data.frame, pero creo que hay una respuesta más elegante en esta pregunta.


Esto devuelve un vector de índice lógico:

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

Aquí hay un ejemplo:

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

Actualización (basada en comentarios):
La complejidad del comando se puede reducir si fromLast = TRUE se usa como argumento de función. Esto es más fácil que crear dos vectores invertidos.

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

¿Cómo funciona?

La función duplicated se aplica tanto a la trama de datos original como a la trama de datos con orden inverso de filas. La salida de este último se invierte nuevamente. Tenga en cuenta que las primeras ocurrencias de valores duplicados en los datos originales son las últimas ocurrencias en la versión invertida. Después, ambos vectores se combinan usando | ya que un TRUE en al menos uno de ellos indica un valor duplicado.


Si está utilizando una tabla de datos con clave, puede usar 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 aquellas filas que son duplicados.

  • unique(...) devuelve solo las combinaciones únicas de las filas duplicadas. Esto trata de cualquier caso con más de 1 duplicado (duplicados duplicados, ej. Triplicados, etc.)

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

También podrías usar

DT[,count := .N,by = list(A,B,C)][count>1, which=T]