Remover linhas duplicadas

Eu li um arquivo CSV em um data.frame R. Algumas das linhas têm o mesmo elemento em uma das colunas. Gostaria de remover linhas que são duplicatas nessa coluna. Por exemplo:

 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 

Eu gostaria apenas de uma dessas linhas, pois as outras têm os mesmos dados na primeira coluna.

apenas isole o seu quadro de dados para as colunas que você precisa, então use a function exclusiva: 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 as pessoas que vieram aqui para procurar uma resposta geral para remoção de linha duplicada, 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 

Answer from: Removendo linhas duplicadas do quadro de dados R

A function distinct() no pacote dplyr executa a remoção arbitrária de duplicatas, permitindo a especificação das variables ​​duplicadas (como nesta questão) ou considerando todas as variables.

Dados:

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

Remover linhas nas quais colunas especificadas são duplicadas:

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

Remover linhas que são duplicatas completas de outras linhas:

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

O pacote data.table também possui methods unique e duplicated , com alguns resources adicionais.

Os methods unique.data.table e o duplicated.data.table têm um argumento adicional que permite que você passe um vetor de character ou integer de nomes de coluna ou seus locais 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 

Outra característica importante desses methods é um grande ganho de desempenho para conjuntos de dados maiores

 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 

Com 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) 

Solução:

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

Saída:

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

Ou você pode aninhar os dados nos cols 4 e 5 em uma única linha com o tidyr :

 library(tidyr) df %>% nest(V4:V5) # A tibble: 1 × 4 # V1 V2 V3 data #     #1 platform_external_dbus 202 16  

As duplicatas col 2 e 3 são agora removidas para análise estatística, mas você manteve os dados col 4 e 5 em um tibble e pode voltar para o quadro de dados original em qualquer ponto com unnest() .

a resposta geral pode ser por exemplo:

 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)), ] 

saída:

  X1 X2 X3 1 2 9 6 2 4 6 7 

Você também pode usar a dplyr distinct() dplyr ! Ele tende a ser mais eficiente do que opções alternativas, especialmente se você tiver cargas de observações.

 distinct_data < - dplyr::distinct(yourdata)