Eliminar filas duplicadas

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.

solo aísle su dataframe 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. 

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), ] ab 2 A 1 6 B 1 8 C 2 > df[!duplicated(df), ] ab 1 A 1 3 A 2 4 B 4 5 B 1 7 C 2 

Respuesta de: Eliminar filas duplicadas del dataframe R

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) ab 1 1 A 2 2 B 

Eliminar filas que son duplicados completos de otras filas:

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

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 

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:

  ab 1 A 1 2 A 2 3 B 4 4 B 1 5 C 2 

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 #     #1 platform_external_dbus 202 16  

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 dataframe original en cualquier punto con unnest() .

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 

¡También puede usar la dplyr distinct() dplyr ! Tiende a ser más eficiente que las opciones alternativas, especialmente si tiene muchas observaciones.

 distinct_data < - dplyr::distinct(yourdata)