HOWTO · R
Eliminar filas duplicadas por columna en R
Este artículo demuestra cómo eliminar filas duplicadas por columna en R
En esta página
Para conservar una fila por cada clave seleccionada en un data frame de R, utilice distinct() de dplyr con .keep_all = TRUE cuando necesite las demás columnas. Cada método siguiente conserva la fila coincidente más temprana en el orden actual de los datos, así que ordene primero cuando otro registro deba tener prioridad. Los ejemplos utilizan un data frame pequeño con las columnas id, group y score.
Utilice la función distinct del paquete dplyr para eliminar filas duplicadas por columna en R
Utilice distinct(df, id, .keep_all = TRUE) cuando id defina un registro único y desee todas las columnas originales en el resultado. distinct() compara las columnas clave seleccionadas y conserva la primera fila para cada valor de clave. Con .keep_all = TRUE, las demás columnas se incorporan al resultado, pero no afectan a si dos filas coinciden. Sin ese argumento, el resultado contiene solo las columnas seleccionadas.
Para una clave compuesta, enumere cada columna: distinct(df, id, group, .keep_all = TRUE). Las filas con el mismo id pero valores de group diferentes permanecen entonces separadas. El siguiente ejemplo completo utiliza los mismos datos de muestra y muestra ambas opciones de clave. Requiere que dplyr esté instalado; sus resultados se describen a continuación, y este ejemplo no va acompañado de salida en tiempo de ejecución.
df <- data.frame(
id = c(1, 2, 2, 3, 3),
group = c("A", "A", "B", "A", "B"),
score = c(8, 5, 9, 4, 7)
)
if (requireNamespace("dplyr", quietly = TRUE)) {
unique_by_id <- dplyr::distinct(df, id, .keep_all = TRUE)
unique_by_pair <- dplyr::distinct(df, id, group, .keep_all = TRUE)
print(unique_by_id)
print(unique_by_pair)
} else {
cat("Install dplyr to run these distinct() examples.\n")
}
El resultado de clave única conserva (1, A, 8), (2, A, 5) y (3, A, 4). El resultado de clave compuesta conserva esas filas además de (2, B, 9) y (3, B, 7), porque cada par de id y group es único. El siguiente ejemplo separado en R base imprime ambos resultados.
df <- data.frame(
id = c(1, 2, 2, 3, 3),
group = c("A", "A", "B", "A", "B"),
score = c(8, 5, 9, 4, 7)
)
unique_by_id <- df[!duplicated(df$id), ]
unique_by_pair <- df[!duplicated(df[c("id", "group")]), ]
cat("By id:\n")
cat(paste(unique_by_id$id, unique_by_id$group, unique_by_id$score, sep = ":"), sep = "\n")
cat("\nBy id and group:\n")
cat(paste(unique_by_pair$id, unique_by_pair$group, unique_by_pair$score, sep = ":"), sep = "\n")
By id:
1:A:8
2:A:5
3:A:4
By id and group:
1:A:8
2:A:5
2:B:9
3:A:4
3:B:7
Aquí, !duplicated(df$id) marca las apariciones posteriores de cada id; pasar un data frame de columnas clave a duplicated() aplica la misma regla de primera aparición a su combinación. Ambas selecciones conservan todas las columnas de cada fila elegida.
Utilice las funciones group_by, filter y duplicated para eliminar filas duplicadas por columna en R
Para una única clave global id, filter(!duplicated(id)) conserva su primera aparición. Si la entrada ya pudiera estar agrupada, llame primero a ungroup() para que filter() evalúe la comprobación de duplicados sobre todos los datos:
df %>% ungroup() %>% filter(!duplicated(id))
La tubería %>% pasa el valor de su izquierda como primer argumento a la función de su derecha. Agrupar por id antes de filter(!duplicated(id)) no elimina las filas posteriores: dentro de cada grupo de id, esa clave es constante, por lo que duplicated(id) no encuentra ninguna aparición posterior. Agrupar por otra columna es útil cuando los ID pueden repetirse de forma independiente dentro de cada grupo; entonces duplicated(id) conserva la primera aparición de cada ID en cada grupo. Para una única clave global, la expresión sin agrupar tiene el mismo comportamiento de primera fila que la selección en R base anterior.
Por ejemplo, agrupar por group aplica la misma comprobación por separado dentro de cada grupo:
df %>%
group_by(group) %>%
filter(!duplicated(id)) %>%
ungroup()
Esta canalización conserva la primera fila para cada id dentro de cada group, según el orden actual de las filas. En los datos de muestra, cada par de id y group aparece solo una vez, por lo que cada fila es la primera aparición de su id dentro de su grupo y se conservan las cinco filas; una fila adicional que repitiera un id ya visto en el mismo grupo se descartaría.
Utilice las funciones group_by y slice para eliminar filas duplicadas por columna en R
La canalización de dplyr df %>% group_by(id) %>% slice(1) %>% ungroup() selecciona la posición 1 de cada grupo de id. El orden actual de las filas determina qué registro es el primero; slice(1) no selecciona automáticamente la puntuación más alta ni el registro más reciente. Ordene los datos según la preferencia que desee antes de agrupar y cortar, y desagrupe después cuando las operaciones posteriores deban tratar el resultado como un data frame ordinario.
Para los datos de muestra, este método conserva las mismas filas que los enfoques de distinct() y duplicated() de clave única: la primera fila para los ID 1, 2 y 3. Utilice distinct() cuando la tarea consista en seleccionar combinaciones de claves únicas; utilice slice(1) cuando seleccionar una fila por su posición dentro de cada grupo forme parte de un flujo de trabajo agrupado más amplio. Estas expresiones de dplyr son ilustrativas y requieren el paquete dplyr; el ejemplo en R base anterior se ejecuta sin esa dependencia.