2014-04-09 12 views
82

ho un data.frame come questo -Rimuovere duplicato righe utilizzando dplyr

set.seed(123) 
df = data.frame(x=sample(0:1,10,replace=T),y=sample(0:1,10,replace=T),z=1:10) 
> df 
    x y z 
1 0 1 1 
2 1 0 2 
3 0 1 3 
4 1 1 4 
5 1 0 5 
6 0 1 6 
7 1 0 7 
8 1 0 8 
9 1 0 9 
10 0 1 10 

Vorrei rimuovere le righe duplicate sulla base di prime due colonne. Uscita prevista -

df[!duplicated(df[,1:2]),] 
    x y z 
1 0 1 1 
2 1 0 2 
4 1 1 4 

Sono specificamente alla ricerca di una soluzione utilizzando il pacchetto dplyr.

risposta

87
library(dplyr) 
set.seed(123) 
df <- data.frame(
    x = sample(0:1, 10, replace = T), 
    y = sample(0:1, 10, replace = T), 
    z = 1:10 
) 

Un approccio potrebbe essere quello di gruppo, e poi tenere solo i gruppi con una sola fila :

df %>% group_by(x, y) %>% filter(row_number(z) == 1) 

## Source: local data frame [3 x 3] 
## Groups: x, y 
## 
## x y z 
## 1 0 1 1 
## 2 1 0 2 
## 3 1 1 4 

(In dplyr 0.2 non sarà necessario il z variabile dummy e sarà solo in grado di scrivere row_number() == 1)

ho anche pensato di aggiungere una funzione slice() che avrebbe lavoro come:

0.123.
df %>% group_by(x, y) %>% slice(from = 1, to = 1) 

O forse una variazione di unique() che permetterà di selezionare quale variabili da utilizzare:

df %>% unique(x, y) 
+3

@dotcomken Fino ad allora potrebbe anche usare appena 'df%>% group_by (x, y)%>% fare (testa (, 1)) ' –

+12

@MahbubulMajumder che funzionerà, ma è piuttosto lento. dplyr 0.3 avrà 'distinct()' – hadley

+1

@hadley Mi piace la funzione unique() e distinct(), tuttavia, tutti rimuovono il secondo duplicato dal frame di dati. cosa succede se voglio rimuovere tutti i primi incontri del valore duplicato? Come si può fare? Grazie per qualsiasi aiuto! – FlyingDutch

132

Ecco una soluzione che utilizza dplyr 0.3.

library(dplyr) 
set.seed(123) 
df <- data.frame(
    x = sample(0:1, 10, replace = T), 
    y = sample(0:1, 10, replace = T), 
    z = 1:10 
) 

> df %>% distinct(x, y) 
    x y z 
    1 0 1 1 
    2 1 0 2 
    3 1 1 4 

aggiornato per dplyr 0,5

versione dplyr comportamento di default di 0,5 distinct() restituisce solo colonne specificate nella ... argomento.

per raggiungere il risultato originale, ora è necessario utilizzare:

df %>% distinct(x, y, .keep_all = TRUE) 
+1

Questa soluzione sembra essere molto più veloce (10 volte nel mio caso) di quella fornita da Hadley. – Calimo

+71

Tecnicamente anche questa è una soluzione fornita da Hadley :-) –

16

Per completezza, il seguente funziona anche:

df %>% group_by(x) %>% filter (! duplicated(y)) 

Tuttavia, io preferisco la soluzione con distinct, e io sospetto che sia anche più veloce.

0

Quando si selezionano le colonne in R per un set di dati ridotto, è spesso possibile trovare duplicati.

Queste due righe danno lo stesso risultato. Ogni uscita un insieme di dati unica con solo due colonne selezionate:.

distinct(mtcars, cyl, hp); 

summarise(group_by(mtcars, cyl, hp));