seleccionar identificar filas eliminar elementos duplicated duplicados duplicado duplicadas datos columnas r duplicates r-faq

identificar - Eliminar filas duplicadas



identificar duplicados en r (7)

Con sqldf :

# Example by Mehdi Nellen 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)

Solución:

library(sqldf) sqldf(''SELECT DISTINCT * FROM df'')

Salida:

a b 1 A 1 2 A 2 3 B 4 4 B 1 5 C 2

He leído un archivo CSV en un R data.frame. Algunas de las filas tienen el mismo elemento en una de las columnas. Me gustaría eliminar las filas que son duplicados 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.


El paquete data.table también tiene métodos unique y duplicated propios con algunas características adicionales.

Tanto los unique.data.table como duplicated.data.table tienen un argumento adicional que le permite pasar un character o integer vector integer de nombres de columna 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 gran 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


La función distinct() en el paquete dplyr realiza la eliminación de duplicados arbitrarios, permitiendo la especificación de las variables duplicadas (como en esta pregunta) o considerando todas las variables.

Datos:

dat <- data.frame(a = rep(c(1,2),4), b = rep(LETTERS[1:4],2))

Eliminar filas donde las columnas especificadas están duplicadas:

library(dplyr) dat %>% distinct(a, .keep_all = TRUE) a b 1 1 A 2 2 B

Eliminar filas que son duplicados completos de otras filas:

dat %>% distinct a b 1 1 A 2 2 B 3 1 C 4 2 D


O puede anidar los datos en cols 4 y 5 en una sola fila con tidyr :

library(tidyr) df %>% nest(V4:V5) # A tibble: 1 × 4 # V1 V2 V3 data # <fctr> <int> <int> <list> #1 platform_external_dbus 202 16 <tibble [5 × 2]>

Los duplicados col 2 y 3 ahora se eliminan para el análisis estadístico, pero usted ha mantenido los datos col 4 y 5 en un tibble y puede volver al marco de datos original en cualquier punto con unnest() .


Para las personas que han venido aquí a buscar una respuesta general para la eliminación de filas duplicadas, use !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 R


la respuesta general puede ser, por ejemplo:

df <- data.frame(rbind(c(2,9,6),c(4,6,7),c(4,6,7),c(4,6,7),c(2,9,6)))) new_df <- df[-which(duplicated(df)), ]

salida:

X1 X2 X3 1 2 9 6 2 4 6 7


solo aísle su marco de datos a 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.