2016-07-22 6 views
2

Es gibt viele ähnliche Fragen, aber ich möchte 2 Spalten vergleichen und alle Duplikate in beiden Spalten löschen, so dass nur noch die eindeutigen Beobachtungen in jeder Spalte übrig sind . Hinweis: Duplikate liegen nicht nebeneinander. Wenn möglich, möchte ich auch eine Liste der Duplikate (nicht nur WAHR/FALSCH). Vielen Dank!R Vergleichen Sie nicht Seite-an-Seite-Duplikate in 2 Spalten

 C1 C2 
    1 a z 
    2 c d 
    3 f a 
    4 e c 

würde hier eine Basis R-Methode duplicated und lapply

 C1 C2 
    1 f z 
    2 e d 

mit doppelter Liste

duplicates: a, c 
+0

können Sie bitte einen Beispieldatenrahmen und das erwartete Ergebnis posten? – Koba

+0

Hinzugefügt! Vielen Dank im Voraus – flightless13wings

+0

Was passiert, wenn sich die Duplikate in Zeilen überschneiden? Zum Beispiel hat eine Zeile ein 'a' und das andere nicht. Würden Sie die gesamte Zeile löschen? – Zelazny7

Antwort

0

werden.

temp <- unlist(df) 
# get duplicated elements 
myDupeVec <- unique(temp[duplicated(temp)]) 

# get list without duplicates 
noDupesList <- lapply(df, function(i) i[!(i %in% myDupeVec)]) 

noDupesList 
$C1 
[1] "f" "e" 

$C2 
[1] "z" "d" 

Daten

df <- read.table(header=T, text=" C1 C2 
    1 a z 
    2 c d 
    3 f a 
    4 e c ", as.is=TRUE) 

Beachten Sie, dass dies eine Liste zurückgibt. Dies ist eine viel flexiblere Struktur, da es im Allgemeinen eine Möglichkeit gibt, dass eine Ebene in einer bestimmten Variablen mehr als einmal wiederholt werden kann. Wenn dies nicht der Fall ist, können Sie do.call und data.frame verwenden, um das Ergebnis in eine rechteckige Struktur zu bringen.

do.call(data.frame, noDupesList) 
    C1 C2 
1 f z 
2 e d 
+0

Vielen Dank! Ich frage mich nur, gibt es einen Weg, der das für 10000 Zeilen macht? – flightless13wings

+0

Dies funktioniert für 10K oder 10M Zeilen. 'unlist' setzt all das in einen langen Vektor. Es kann mit Gedächtnis und Zeit usw. schwierig werden, aber typischerweise mit genügend Speicher, nur ein bisschen Geduld. Ich fügte der zweiten Zeile "einzigartig" hinzu, da dies das Potenzial hat, einige Vergleiche zu beschleunigen. – lmo

+0

Ehrfürchtig. Danke noch einmal! – flightless13wings

1

Hier ist eine andere Antwort

where_dupe <- which(apply(df, 2, duplicated), arr.ind = T) 

Gibt Ihnen die Lage der duplizierten Elemente innerhalb Ihrer ursprünglichen Datenrahmen.

col_unique <- setdiff(1:ncol(df), where_dupe) 

Gibt Ihnen, welche Spalten

keine Duplikate hatte Sie können die Werte durch Indizierung erfahren.

df[,col_unique] 
Verwandte Themen