Eliminar filas duplicadas
He leído un CSV
archivo en un marco de datos R. Algunas de las filas tienen el mismo elemento en una de las columnas. Me gustaría eliminar filas duplicadas en esa columna. Por ejemplo:
platform_external_dbus 202 16 google 1
platform_external_dbus 202 16 space-ghost.verbum 1
platform_external_dbus 202 16 localhost 1
platform_external_dbus 202 16 users.sourceforge 8
platform_external_dbus 202 16 hughsie 1
Me gustaría solo una de estas filas ya que las demás tienen los mismos datos en la primera columna.
Para las personas que han venido aquí para buscar una respuesta general para la eliminación de filas duplicadas, utilice !duplicated()
:
a <- c(rep("A", 3), rep("B", 3), rep("C",2))
b <- c(1,1,2,4,1,1,2,2)
df <-data.frame(a,b)
duplicated(df)
[1] FALSE TRUE FALSE FALSE FALSE TRUE FALSE TRUE
> df[duplicated(df), ]
a b
2 A 1
6 B 1
8 C 2
> df[!duplicated(df), ]
a b
1 A 1
3 A 2
4 B 4
5 B 1
7 C 2
Respuesta de: Eliminar filas duplicadas del marco de datos de R
De forma predeterminada, este método mantendrá la primera aparición de cada duplicado. Puede utilizar el argumento fromLast = TRUE
para mantener la última aparición de cada duplicado. Puede ordenar sus datos antes de este paso para que mantengan las filas que desea.
simplemente aísle su marco de datos en las columnas que necesita, luego use la función única: D
# in the above example, you only need the first three columns
deduped.data <- unique( yourdata[ , 1:3 ] )
# the fourth column no longer 'distinguishes' them,
# so they're duplicates and thrown out.
La función distinct()
en el dplyr
paquete realiza la eliminación arbitraria de duplicados, ya sea de columnas/variables específicas (como en esta pregunta) o considerando todas las columnas/variables. dplyr
es parte del tidyverse
.
Datos y paquete
library(dplyr)
dat <- data.frame(a = rep(c(1,2),4), b = rep(LETTERS[1:4],2))
Eliminar filas duplicadas en una columna específica (por ejemplo, columna a
)
Tenga en cuenta que .keep_all = TRUE
se conservan todas las columnas; de lo contrario, solo a
se conservará la columna.
distinct(dat, a, .keep_all = TRUE)
a b
1 1 A
2 2 B
Elimine filas que sean duplicados completos de otras filas:
distinct(dat)
a b
1 1 A
2 2 B
3 1 C
4 2 D
El data.table
paquete también tiene unique
métodos duplicated
propios con algunas características adicionales.
Tanto el método unique.data.table
como el duplicated.data.table
tienen un argumento adicional by
que le permite pasar un character
vector integer
de nombres de columnas o sus ubicaciones respectivamente.
library(data.table)
DT <- data.table(id = c(1,1,1,2,2,2),
val = c(10,20,30,10,20,30))
unique(DT, by = "id")
# id val
# 1: 1 10
# 2: 2 10
duplicated(DT, by = "id")
# [1] FALSE TRUE TRUE FALSE TRUE TRUE
Otra característica importante de estos métodos es una enorme ganancia de rendimiento para conjuntos de datos más grandes.
library(microbenchmark)
library(data.table)
set.seed(123)
DF <- as.data.frame(matrix(sample(1e8, 1e5, replace = TRUE), ncol = 10))
DT <- copy(DF)
setDT(DT)
microbenchmark(unique(DF), unique(DT))
# Unit: microseconds
# expr min lq mean median uq max neval cld
# unique(DF) 44708.230 48981.8445 53062.536 51573.276 52844.591 107032.18 100 b
# unique(DT) 746.855 776.6145 2201.657 864.932 919.489 55986.88 100 a
microbenchmark(duplicated(DF), duplicated(DT))
# Unit: microseconds
# expr min lq mean median uq max neval cld
# duplicated(DF) 43786.662 44418.8005 46684.0602 44925.0230 46802.398 109550.170 100 b
# duplicated(DT) 551.982 558.2215 851.0246 639.9795 663.658 5805.243 100 a
Aquí hay una solución muy simple y dplyr
rápida tidy
:
Elimine filas que sean completamente iguales:
library(dplyr)
iris %>%
distinct(.keep_all = TRUE)
Elimine filas que sean iguales solo en determinadas columnas:
iris %>%
distinct(Sepal.Length, Sepal.Width, .keep_all = TRUE)