R's duplicated
devuelve un vector que muestra si cada elemento de un vector o marco de datos es un duplicado de un elemento con un subíndice más pequeño. Entonces, si las filas 3, 4 y 5 de un marco de datos de 5 filas son iguales, duplicated
me darán el vector
FALSE, FALSE, FALSE, TRUE, TRUE
Pero en este caso realmente quiero obtener
FALSE, FALSE, TRUE, TRUE, TRUE
es decir, quiero saber si una fila también está duplicada por una fila con un subíndice más grande .
fuente
x <- c(1:9, 7:10, 5:22); y <- c(letters, letters[1:5]); test <- data.frame(x, y); test[duplicated(test$x) | duplicated(test$x, fromLast=TRUE), ]
devolví las tres copias de 7, 8 y 9. ¿Por qué funciona?duplicated(c(1,1,1))
vsduplicated(c(1,1,1,), fromLast = TRUE)
dac(FALSE,TRUE,TRUE)
yc(TRUE,TRUE,FALSE)
. El valor medio esTRUE
en ambos casos. Tomando|
ambos vectores dac(TRUE,TRUE,TRUE)
.Necesita ensamblar el conjunto de
duplicated
valores, aplicarunique
y luego probar con%in%
. Como siempre, un problema de muestra hará que este proceso cobre vida.fuente
duplicated
,unique
y%in%
podría generalizarse fácilmente a un marco de datos si uno fuera primeropaste
cada fila con un carácter separador inusual. (La respuesta aceptada es mejor.)He tenido la misma pregunta y, si no me equivoco, esta también es una respuesta.
Sin embargo, no sé cuál es más rápido, el conjunto de datos que estoy usando actualmente no es lo suficientemente grande para hacer pruebas que produzcan brechas de tiempo significativas.
fuente
vec
tanto como vector atómico como como marco de datos. Sospecho que con un marco de datos real fallaría.Las filas duplicadas en un marco de datos se pueden obtener
dplyr
haciendoPara excluir ciertas columnas se
group_by_at(vars(-var1, -var2))
podría utilizar en su lugar para agrupar los datos.Si realmente se necesitan los índices de fila y no solo los datos, puede agregarlos primero como en:
fuente
n()
. No olvide desagrupar el marco de datos resultante.Aquí está la solución de @Joshua Ulrich como función. Este formato le permite usar este código de la misma manera que usaría duplicated ():
Usando el mismo ejemplo:
fuente
Si está interesado en qué filas están duplicadas para ciertas columnas, puede usar un enfoque plyr :
Añadiendo una variable de recuento con dplyr :
Para filas duplicadas (considerando todas las columnas):
El beneficio de estos enfoques es que puede especificar cuántos duplicados como límite.
fuente
Tuve un problema similar, pero necesitaba identificar filas duplicadas por valores en columnas específicas. Se me ocurrió la siguiente solución dplyr :
El código agrupa las filas por columnas específicas. Si la longitud de un grupo es mayor que 1, el código marca todas las filas del grupo como duplicadas. Una vez hecho esto, puede usar la
Duplicated
columna para filtrar, etc.fuente