Eliminar filas duplicadas

Resuelto user1897691 asked hace 54 años • 10 respuestas

He leído un CSVarchivo 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.

user1897691 avatar Jan 01 '70 08:01 user1897691
Aceptado

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 = TRUEpara mantener la última aparición de cada duplicado. Puede ordenar sus datos antes de este paso para que mantengan las filas que desea.

Mehdi Nellen avatar Feb 24 '2014 12:02 Mehdi Nellen

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.
Anthony Damico avatar Dec 20 '2012 07:12 Anthony Damico

La función distinct()en el dplyrpaquete realiza la eliminación arbitraria de duplicados, ya sea de columnas/variables específicas (como en esta pregunta) o considerando todas las columnas/variables. dplyres 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 = TRUEse conservan todas las columnas; de lo contrario, solo ase 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
Sam Firke avatar May 29 '2015 01:05 Sam Firke

El data.tablepaquete también tiene uniquemétodos duplicatedpropios con algunas características adicionales.

Tanto el método unique.data.tablecomo el duplicated.data.tabletienen un argumento adicional byque le permite pasar un charactervector integerde 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 
David Arenburg avatar Mar 17 '2016 11:03 David Arenburg

Aquí hay una solución muy simple y dplyrrá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)

stevec avatar May 02 '2020 05:05 stevec