2011-10-21 17 views
68

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. Así que si las filas 3, 4 y 5 de una trama de datos de 5 filas son los mismos, duplicated me dará el vectorEncontrar TODAS las filas duplicadas, incluidos los "elementos con subíndices más pequeños"

FALSE, FALSE, FALSE, TRUE, TRUE 

Pero en este caso que en realidad quiere conseguir

FALSE, FALSE, TRUE, TRUE, TRUE 

que es decir, quiero saber si una fila está duplicada por una fila con un subíndice más grande también.

Respuesta

74

duplicated tiene un argumento fromLast. La sección "Ejemplo" de ?duplicated le muestra cómo usarlo. Simplemente llame al duplicated dos veces, una vez con fromLast=FALSE y una vez con fromLast=TRUE y tome las filas donde cualquiera de ellas es TRUE.


Algunos Editar tarde: No ha proporcionado un ejemplo reproducible, por lo que aquí es una ilustración amablemente aportado por @jbaums

vec <- c("a", "b", "c","c","c") 
vec[duplicated(vec) | duplicated(vec, fromLast=TRUE)] 
## [1] "c" "c" "c" 
+1

¿Pero esta solución no asume que solo hay 2 valores duplicados? ¿Qué pasa si hay más de 2? Los medios serán ignorados. Sé que el significado literal de la palabra "duplicar" implica "doble", pero una solución más sólida sería @ 42-s, ¿sí? – JoeM05

+2

Espera, acabo de ejecutar una prueba y encontré que estaba equivocado: 'x <- c (1: 9, 7:10, 5:22); y <- c (letras, letras [1: 5]); prueba <- data.frame (x, y); prueba [duplicado (prueba $ x) | duplicado (prueba $ x, fromLast = TRUE),] ' Devolvió las tres copias de 7, 8 y 9. ¿Por qué funciona? – JoeM05

+0

Porque los medios se capturan no importa si comienzas desde el final o desde el frente. Por ejemplo, 'duplicado (c (1,1,1))' vs 'duplicado (c (1,1,1), desde Última = VERDADERO)' da 'c (FALSE, TRUE, TRUE)' y 'c (VERDADERO, VERDADERO, FALSO) '. El valor medio es 'VERDADERO 'en ambos casos. Tomar '|' de ambos vectores da 'c (TRUE, TRUE, TRUE)'. – Brandon

24

Debe ensamblar el conjunto de valores duplicated, aplicar unique, y luego probar con %in%. Como siempre, un problema de muestra hará que este proceso cobre vida.

> vec <- c("a", "b", "c","c","c") 
> vec[ duplicated(vec)] 
[1] "c" "c" 
> unique(vec[ duplicated(vec)]) 
[1] "c" 
> vec %in% unique(vec[ duplicated(vec)]) 
[1] FALSE FALSE TRUE TRUE TRUE 
3

que he tenido el same question, y si no estoy equivocado, esta es también una respuesta.

vec[col %in% vec[duplicated(vec$col),]$col] 

No sé cuál es más rápido, sin embargo, el conjunto de datos actualmente estoy usando no es lo suficientemente grande como para hacer pruebas que producen intervalos de tiempo significativos.

Cuestiones relacionadas