Abgleich von zwei Spalten in R
Ich habe einen großen Datensatz df
(354903 Zeilen) mit zwei Spalten namens df$ColumnName
und df$ColumnName.1
head(df)
CompleteName CompleteName.1
1 Lefebvre Arnaud Lefebvre Schuhl Anne
1.1 Lefebvre Arnaud Abe Lyu
1.2 Lefebvre Arnaud Abe Lyu
1.3 Lefebvre Arnaud Louvet Nicolas
1.4 Lefebvre Arnaud Muller Jean Michel
1.5 Lefebvre Arnaud De Dinechin Florent
Ich versuche, um Etiketten zu erstellen, um zu sehen, Wetter wird der name der gleiche ist oder nicht.
Wenn ich versuche, einen kleinen Teil es funktioniert [1, wenn Sie gleich sind, 0 wenn nicht]:
> match(df$CompleteName[1], df$CompleteName.1[1], nomatch = 0)
[1] 0
> match(df$CompleteName[1:10], df$CompleteName.1[1:10], nomatch = 0)
[1] 0 0 0 0 0 0 0 0 0 0
Aber sobald ich schmeiße die kompletten Spalten, es gibt mir komplett andere Werte, die scheinen Unsinn zu mir:
> match(df$CompleteName, df$CompleteName.1, nomatch = 0)
[1] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101
[23] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101
[45] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101
Sollte ich sapply
? Ich habe nicht herausgefunden, ich habe versucht, diese mit einem Fehler:
sapply(df, function(x) match(x$CompleteName, x$CompleteName.1, nomatch = 0))
Bitte um Hilfe!!!!
Sie wollen wahrscheinlich nicht passen - es gibt die passenden Werte bilden die zweite Spalte, nicht ob Sie gleich sind. Wenn Sie Zeichenfolgen verwenden, könnten Sie wahrscheinlich verwenden Sie einfach
nutzen Sie auch
wie andere haben darauf hingewiesen,
Es gibt auch keine Hinweise, dass diese als Faktor Spalten sowieso, oder?
Das ist nicht das, was ich meinte. Ich meine, wir haben keine Ahnung, ob diese OP hat Faktor Spalten oder nicht. Es gibt keine Beweise in der Frage, die uns sagt, ob Sie Faktor oder Charakter. Es ist keine große Sache, obwohl. Dies ist ein Grund, warum
as.numeric(df$CompleteName == df$CompleteName.1)
nutzen Sie auch
stringsAsFactors = FALSE
im Bau Ihrer Daten.Rahmenwie andere haben darauf hingewiesen,
match
funktioniert hier nicht. mein Kommentar gemeint war, hinzufügen @jeremycg 'sEs gibt auch keine Hinweise, dass diese als Faktor Spalten sowieso, oder?
Das ist nicht das, was ich meinte. Ich meine, wir haben keine Ahnung, ob diese OP hat Faktor Spalten oder nicht. Es gibt keine Beweise in der Frage, die uns sagt, ob Sie Faktor oder Charakter. Es ist keine große Sache, obwohl. Dies ist ein Grund, warum
dput()
ist bevorzugt, wenn die Buchungsdaten in eine Frage.InformationsquelleAutor Saul Garcia | 2016-04-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der man-page von match,
Damit Ihre Daten scheinen zu zeigen, dass das erste match von "Lefebvre Arnaud" (die erste position im ersten argument) ist in der Zeile 101. Ich glaube, was du beabsichtigt hast ist ein einfacher Vergleich, so dass nur der Gleichheitsoperator
==
.Einige Beispiel-Daten:
EDIT: Auch, Sie brauchen, um stellen Sie sicher, dass Sie vergleichen äpfel mit äpfeln, so überprüfen Sie den Datentyp der Spalten. Verwenden
str(df)
um zu sehen, ob die Spalten sind strings oder Faktoren. Sie können entweder den Aufbau der matrix mit "stringsAsFactors = FALSE", oder konvertieren von Faktor Charakter. Es gibt mehrere Möglichkeiten, dies zu tun, überprüfen Sie hier: Konvertieren von Daten.frame-Spalten von Faktoren, die zu ZeichenInformationsquelleAutor andrechalom
Wie andere haben darauf hingewiesen,
match
ist nicht richtig hier. Was Sie wollen, ist die Gleichheit, die Sie bekommen können, durch testen mit==
, die IhnenTRUE/FALSE
. Dann mitas.numeric
geben Sie das gewünschte1/0
oder mitwhich
geben Sie die Indizes.Aber können Sie immer noch ein Problem mit Faktoren!
stringsAsFactors
Oben, die Daten.Rahmen war nicht konstruiert, mit
stringsAsFactors=FALSE
- und einen Fehler verursacht. Leider aus der boxR
wird zwingen, strings, um die Faktoren, die auf das laden einescsv
oder die Erstellung einesdata.frame
. Dies kann behoben werden, wenn die Daten erstellen.Rahmen durch explizite AngabestringsAsFactors=FALSE
Um das Problem zu vermeiden in der Zukunft, laufen
options(stringsAsFactors = FALSE)
am Anfang Ihre R-Sitzung (oder legen Sie Sie an der Spitze Ihrer.R
Skript). Weitere Diskussion hier:+1, wenn die Zusammenarbeit auf code es ist besser, es am Anfang einer Skript-Datei als die .Rprofile aus diesem Grund
guter Punkt. Ich habe gerade vertauscht die df zu der einen die andere Antwort
InformationsquelleAutor jaimedash
Hier ist eine Lösung mit einem
data.table
mit performance-Vergleich derdata.frame
Lösung basiert auf einer identischen Anzahl von Datensätzen wie in Ihrem Fall.Den
data.table
Ansatz bietet einen deutlichen Geschwindigkeitszuwachs auf meinem Rechner: von 0.020 s, 0.008 s.Versuchen Sie es selbst und sehen. Ich weiß, das ist nicht wirklich signifikant mit solch einer kleinen Anzahl von Zeilen, aber multipliziere mit 1000 und du wirst sehen, einen großen Unterschied!
Ich glaube nicht, dass es weitaus komplexer ist, als notwendig, die Eingabe
data.table
stattdata.frame
ist eigentlich weniger Tippen und nutzt eine deutlich effizientere storage-Mechanismus. Ich bin froh, dass ich in der Praxis, mit diesem Paket zu einem frühen Zeitpunkt, es hat mich gerettet eine beträchtliche Menge an Zeit, und ich möchte ermutigen, neue R Benutzer, dies ebenfalls zu tun, so dass, wenn die es wirklich brauchen, Sie haben die Werkzeuge im Ort.Das problem sehe ich in deiner Antwort ist zu lernen, die
data.table
syntax.col3:=
ist absolut bedeutungslos für jemanden, der nicht verstehendata.table
syntax. Es ist eine sehr elegante Linie, und wesentlich effizienter als manche "pur-R" - code, aber es zu benutzen oder nicht, ist die Wahl dennoch.Ich Schätze, diese Antwort werde ich mich tief in dieses
data.table
Methode. Es wird definitiv helfen Sie mir, wenn ich zu reduzieren, die Betriebszeit, normalerweise war ich den Umgang mit den 2 Millionen Zeilen, dataset, und dies war eine Kombination aus einer Teilmenge von 800 Datensätze. Vielen Dank für den Einblick!!!InformationsquelleAutor Matt Weller