Vergleichen Sie zwei data.frames, um die Zeilen in data.frame 1 zu finden, die in data.frame 2 nicht vorhanden sind
Habe ich die folgenden 2 Daten.frames:
a1 <- data.frame(a = 1:5, b=letters[1:5])
a2 <- data.frame(a = 1:3, b=letters[1:3])
Ich möchte die Zeile a1, a2 nicht.
Gibt es eine integrierte Funktion für diese Art von Betrieb?
(p.s: geschrieben habe ich eine Lösung für Sie, ich bin einfach nur neugierig, ob jemand bereits eine mehr gestalteten code)
Hier ist meine Lösung:
a1 <- data.frame(a = 1:5, b=letters[1:5])
a2 <- data.frame(a = 1:3, b=letters[1:3])
rows.in.a1.that.are.not.in.a2 <- function(a1,a2)
{
a1.vec <- apply(a1, 1, paste, collapse = "")
a2.vec <- apply(a2, 1, paste, collapse = "")
a1.without.a2.rows <- a1[!a1.vec %in% a2.vec,]
return(a1.without.a2.rows)
}
rows.in.a1.that.are.not.in.a2(a1,a2)
InformationsquelleAutor der Frage Tal Galili | 2010-07-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese nicht beantworten Ihre Frage direkt, aber es wird Sie geben, die Elemente, die allgemein üblich sind. Diese kann getan werden, mit Paul Murrell ' s package
vergleichen
:Die Funktion
compare
gibt Ihnen eine Menge Flexibilität in Bezug auf welche Vergleiche sind zulässig (z.B. änderung der Reihenfolge der Elemente jedes Vektors, ändern der Reihenfolge und Namen der Variablen, die Verkürzung der Variablen, ändern Fall von strings). Aus diesem Grund, Sie sollten in der Lage sein, um herauszufinden, was fehlte, aus dem einen oder anderen. Zum Beispiel (dies ist nicht sehr elegant):InformationsquelleAutor der Antwort nullglob
SQLDF
bietet eine schöne LösungUnd die Zeilen, die in beiden data frames:
Die neue version von
dplyr
hat eine Funktion,anti_join
für genau diese Art von VergleicheSowie
semi_join
zum filtern von Zeilen ina1
werden, die auch ina2
InformationsquelleAutor der Antwort Rickard
Es ist sicherlich nicht effizient, für diesen bestimmten Zweck, aber was ich oft in diesen Situationen ist, zum einfügen von Indikator-Variablen für die einzelnen Daten.Rahmen und dann merge:
fehlende Werte in included_a1 beachten, welche Zeilen fehlen in a1. ebenso für a2.
Einem problem mit deiner Lösung ist, dass die Spalte Aufträge müssen sich entsprechen. Ein weiteres problem ist, dass es leicht zu Situationen vorstellen, in denen die Zeilen-codiert sind, als die gleichen, wenn in der Tat unterschiedlich sind. Der Vorteil der Verwendung von merge ist, dass Sie kostenlos erhalten, alle Fehler zu überprüfen, ist notwendig für eine gute Lösung.
InformationsquelleAutor der Antwort Eduardo Leoni
In dplyr:
Grundsätzlich
setdiff(bigFrame, smallFrame)
bekommt man die zusätzlichen Datensätze in der ersten Tabelle.In der SQLverse dies wird als eine
Für gute Beschreibungen aller join-Optionen, und wählen Sie Themen, dies ist eine der besten Zusammenfassungen, die ich gesehen habe zusammengestellt Datum: http://www.vertabelo.com/blog/technical-articles/sql-joins
Aber zurück zu dieser Frage - hier sind die Ergebnisse für die
setdiff()
- code bei der Verwendung des OP - Daten:Oder sogar
anti_join(a1,a2)
erhalten Sie die gleichen Ergebnisse.Für mehr info: https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf
InformationsquelleAutor der Antwort leerssej
Schrieb ich ein Paket (https://github.com/alexsanjoseph/compareDF) da hatte ich das gleiche Problem.
Einer komplizierteren Beispiel:
Das Paket hat auch eine html_output Befehl für die schnelle überprüfung
InformationsquelleAutor der Antwort Alex Joseph
Ich angepasst, die
merge
- Funktion verwenden, um diese Funktionalität. Auf größeren dataframes es verbraucht weniger Speicher als die full-merge-Lösung. Und ich kann spielen mit den Namen der wichtigsten Spalten.Andere Lösung ist die Nutzung der Bibliothek
prob
.InformationsquelleAutor der Antwort Henrico
Mit
diffobj
Paket:InformationsquelleAutor der Antwort zx8754
Könnten Sie die
daff
- Paket (das schließt diedaff.js
- Bibliothek mit derV8
- Paket):ergibt sich die folgende Differenz Objekt:
Den diff-format ist beschrieben in Kopiere highlighter-diff-format für Tabellen und sollte ziemlich selbsterklärend. Die Zeilen mit
+++
in der ersten Spalte@@
sind diejenigen, die neu ina1
und nicht ina2
.Den Unterschied-Objekt kann verwendet werden, um
patch_data()
die zum speichern der Differenz für Zwecke der Dokumentation, mitwrite_diff()
oder visualisieren die Differenzrender_diff()
:erzeugt eine saubere HTML-Ausgabe:
InformationsquelleAutor der Antwort Salim B
Ihrem Beispiel Daten, die keine Duplikate sind, aber Ihre Lösung verarbeiten Sie automatisch. Dies bedeutet, dass möglicherweise einige der Antworten übereinstimmen, wird nicht zu den Ergebnissen Ihrer Funktion im Fall von Duplikaten.
Hier ist meine Lösung, die Adresse Duplikate der gleichen Weise, wie bei Ihnen. Es skaliert Super!
Braucht es Daten.Tabelle 1.9.7, die derzeit installiert werden können aus dem source-repo -
InformationsquelleAutor der Antwort jangorecki
Vielleicht ist es zu simpel, aber ich habe diese Lösung und ich finde es sehr nützlich, wenn ich einen primary key, dass ich kann verwenden zum vergleichen von Daten-sets. Hoffe, es kann helfen.
InformationsquelleAutor der Antwort Kenia Sousa
Doch eine andere Lösung basiert auf match_df in plyr.
Hier ist plyr ist match_df:
Wir können es ändern, zu annullieren:
Dann:
InformationsquelleAutor der Antwort chrisendres