2016-08-13 6 views
0

Ich habe eine große Menge von Daten, die ich in eine Liste aufgeteilt habe. Im Folgenden finden Sie eine kleine Auswahl aus einer der Listenelemente:Wie man ein Element mit einem anderen Element in einer anderen Zeile und einer anderen Spalte in r vergleicht

>tes 
     Bike CheckoutKioskName Checkout_date_time ReturnKioskName Return_date_time 
24627 1  67th & Pine 2013-03-12 17:54:22   Shop 2013-03-12 20:32:40 
24847 1 67th & Frances 2013-05-17 10:31:44 67th & Frances 2013-05-17 10:51:53 
24852 1 67th & Frances 2013-05-18 09:27:13 Aksarben Drive 2013-05-18 10:05:29 
24864 1 Aksarben Drive 2013-05-18 10:47:13 Aksarben Drive 2013-05-18 10:52:24 
24998 1 Aksarben Drive 2013-06-05 19:48:05 67th & Frances 2013-06-26 17:06:52 
25434 1 67th & Frances 2013-06-26 19:10:28 67th & Frances 2013-06-26 20:08:09 

ich die ReturnKioskName zu den nächsten Zeilen vergleichen wollen CheckoutKioskName und wenn sie ich zwei Flagge nicht übereinstimmen wollen diese beiden Reihen und sie in eine neue Daten platzieren Rahmen. Ich habe versucht, dies ein paar verschiedene Möglichkeiten zu tun und möchte zunächst vermeiden, einen neuen Datenrahmen zu erstellen, nur um die ReturnKioskName nach unten zu verschieben. Ich habe versucht mit:

tes <- tes[tes$CheckoutKioskName != lag(tes$ReturnKioskName),] 

Aber das gibt mir nicht die Ausgabe, die ich möchte. Die bevorzugte Ausgabe sollte so aussehen:

Das sollte es in diesem kleinen Beispiel sein, denn das ist das einzige Mal, dass sie nicht übereinstimmen. Ich plane, diesen Prozess zu verwenden, um eine riesige Liste dieser Instanzen zu erstellen, nachdem ich es durch jedes Element meiner großen Liste ("fz") ausgeführt habe.

Ich danke Ihnen für jede mögliche Hilfe, die Sie zur Verfügung stellen können.

Antwort

0

Ich möchte zuerst allen für all die Ideen danken und sich Zeit nehmen, auf mein Problem zu antworten. Mit Ideen von allen konnte ich das Problem mit diesem Code lösen:

mismatch <- tes[tes$CheckoutKioskName[-1] != tes$ReturnKioskName & tes$co != nrow(tes),'co'] 
mismatch.pairs <- c(mismatch, mismatch +1) 
tes[tes$co %in% mismatch.pairs,] 
1

Wir können base R verwenden, um den vorherigen Wert mit dem aktuellen in den beiden Spalten zu vergleichen, indem die erste Beobachtung und die letzte Beobachtung in diesen Spalten entfernt, verglichen, mit TRUE angehängt werden (da die Länge 1 kleiner ist als die Anzahl von Elemente in der Spalte) und verwenden Sie diese, um die Zeilen von 'tes' zu unterteilen.

tes[with(tes, c(TRUE, CheckoutKioskName[-1] != ReturnKioskName[-nrow(tes)])),] 
#  Bike CheckoutKioskName Checkout_date_time ReturnKioskName Return_date_time 
#24627 1  67th & Pine 2013-03-12 17:54:22   Shop 2013-03-12 20:32:40 
#24847 1 67th & Frances 2013-05-17 10:31:44 67th & Frances 2013-05-17 10:51:53 

Der Grund lag (von dplyr funktionierte nicht), weil die default Option NA ist, wenn wir die default ändern, könnte es funktionieren.

tes[with(tes, CheckoutKioskName != lag(ReturnKioskName, 
           default = ReturnKioskName[1])),] 
#  Bike CheckoutKioskName Checkout_date_time ReturnKioskName Return_date_time 
# 24627 1  67th & Pine 2013-03-12 17:54:22   Shop 2013-03-12 20:32:40 
# 24847 1 67th & Frances 2013-05-17 10:31:44 67th & Frances 2013-05-17 10:51:53 
0

Ich glaube nicht, dass dies für den gesamten Datenrahmen funktioniert. Ich habe ein einzelnes Listenelement, an dem ich das teste, bevor ich es durch die gesamte Liste führe. Ich habe deinen Code oben auf dem df verwendet, aber bevor ich das gemacht habe, habe ich eine neue Spalte erstellt, die die Anzahl der Zeilen beibehält. Wenn der Code richtig funktioniert, sollte ich Spaltennummern in aufeinander folgenden Paaren sehen (d. H. 1 & 2 dann 21 & 22 usw.), aber das ist nicht passiert.

 Bike    CheckoutKioskName    ReturnKioskName Checkout_date_time Return_date_time co 
24627 1     67th & Pine       Shop 2013-03-12 17:54:22 2013-03-12 20:32:40 1 
24847 1     67th & Frances     67th & Frances 2013-05-17 10:31:44 2013-05-17 10:51:53 2 
23075 1 Bob Kerrey Pedestrian Bridge     13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 91 
23212 1     13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-21 13:35:50 2014-10-21 13:49:21 95 
23370 1 Bob Kerrey Pedestrian Bridge     13th & Howard 2014-10-28 12:49:42 2014-10-28 23:05:05 119 
23379 1     13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-30 09:50:55 2014-10-30 10:06:10 121 
23686 1 Bob Kerrey Pedestrian Bridge Tom Hanafan River's Edge Park 2014-11-22 15:16:46 2014-11-22 16:57:24 131 
23723 1 Tom Hanafan River's Edge Park   Lewis & Clark Landing 2014-11-28 13:54:32 2014-11-28 15:10:35 133 
23750 1   Lewis & Clark Landing Tom Hanafan River's Edge Park 2014-11-29 14:06:20 2014-11-29 14:20:03 135 
23753 1 Tom Hanafan River's Edge Park Bob Kerrey Pedestrian Bridge 2014-11-29 14:28:02 2014-11-29 14:48:28 139 
7014  1   Lewis & Clark Landing   Lewis & Clark Landing 2015-06-02 17:52:41 2015-06-02 19:32:31 154 

Wenn Sie auf die ferne 'co' Spalte schauen, können Sie sehen, dass die Paare nicht aufeinander folgen. Ich bin mir nicht sicher, warum ich so unterschiedliche Paarungen bekomme.

@akrun hast du eine Idee von was könnte los sein?

+0

Auch der Lag-Code hat nicht funktioniert und es gab tatsächlich eine viel andere Ausgabe als die Basis-Version. – Brett

+1

Können Sie eine minimale Eingabe bereitstellen, die die falsche Ausgabe mit der bereitgestellten Lösung erzeugt, wird es einfacher, Fehler zu beheben. Sie könnten 'dput' für den kleinen Datensatz verwenden und die Ergebnisse einfügen. Dies wird es schneller zu analysieren. – steveb

+0

Ich denke, das sollte eine Bearbeitung Ihrer Frage sein und keine Antwort. Ich habe dein Beispiel benutzt und es gibt die erwartete Ausgabe. – akrun

0

Möchten Sie beide Zeilen von einem nicht übereinstimmenden Paar halten?In diesem Fall erhalten Sie zunächst die Indizes auf das erste Element eines nicht übereinstimmen Paar entsprechen:

mismatch <- which(test$CheckoutKioskName[-1] != test$ReturnKioskName[-nrow(tes)]) 

dann die Zeilen extrahieren und die folgenden:

tes[sort(c(mismatch, mismatch + 1)), ] 
+0

Das gibt mir eine extrem seltsame Ausgabe. – Brett

+0

Ich bearbeitet, um die Zeilen zu sortieren. –

0

Hier ist ein wenig größer Satz von Daten:

> so 
     Bike   CheckoutKioskName    ReturnKioskName Checkout_date_time Return_date_time co 
557  1 Bob Kerrey Pedestrian Bridge    13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 90 
23075 1 Bob Kerrey Pedestrian Bridge    13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 91 
612  1    13th & Howard    13th & Howard 2014-10-18 14:17:45 2014-10-18 15:37:54 92 
23130 1    13th & Howard    13th & Howard 2014-10-18 14:17:45 2014-10-18 15:37:54 93 
694  1    13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-21 13:35:50 2014-10-21 13:49:21 94 
23212 1    13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-21 13:35:50 2014-10-21 13:49:21 95 
702  1 Bob Kerrey Pedestrian Bridge Bob Kerrey Pedestrian Bridge 2014-10-21 17:21:00 2014-10-21 17:23:21 96 
23220 1 Bob Kerrey Pedestrian Bridge Bob Kerrey Pedestrian Bridge 2014-10-21 17:21:00 2014-10-21 17:23:21 97 
722  1 Bob Kerrey Pedestrian Bridge Bob Kerrey Pedestrian Bridge 2014-10-23 16:38:25 2014-10-23 17:30:54 98 
23240 1 Bob Kerrey Pedestrian Bridge Bob Kerrey Pedestrian Bridge 2014-10-23 16:38:25 2014-10-23 17:30:54 99 
729  1 Bob Kerrey Pedestrian Bridge Bob Kerrey Pedestrian Bridge 2014-10-23 21:53:14 2014-10-23 22:25:21 100 

in dieser Teilmenge der Suche, wenn ich erfolgreich bin sollte ich zwei Paare bekommen, die sein sollte:

 Bike   CheckoutKioskName    ReturnKioskName Checkout_date_time Return_date_time co 
557  1 Bob Kerrey Pedestrian Bridge    13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 90 
23075 1 Bob Kerrey Pedestrian Bridge    13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 91 
694  1    13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-21 13:35:50 2014-10-21 13:49:21 94 
23212 1    13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-21 13:35:50 2014-10-21 13:49:21 95 

Aber wenn ich laufe:

so[with(so, c(TRUE, CheckoutKioskName[-1] != ReturnKioskName[-nrow(so)])),] 

ich:

 Bike   CheckoutKioskName    ReturnKioskName Checkout_date_time Return_date_time co 
557  1 Bob Kerrey Pedestrian Bridge    13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 90 
23075 1 Bob Kerrey Pedestrian Bridge    13th & Howard 2014-10-15 11:22:33 2014-10-15 12:04:43 91 
23212 1    13th & Howard Bob Kerrey Pedestrian Bridge 2014-10-21 13:35:50 2014-10-21 13:49:21 95 

Ich beginne zu fragen, ob es nur einfacher wäre, einen einfachen Vergleich zu tun, um die Reihe zu bekommen, wo die ReturnKioskName doesn ‚t die nächste CheckoutKioskName mit übereinstimmen:

tes[tes$CheckoutKioskName[-1] != tes$ReturnKioskName,] 

Dann schreiben Sie ein auf pa hinzufügen ir der Ausgang jeder Reihe mit der nächsten Reihe in der df. Denn wenn ich diesen Code ausführen, bekomme ich:

Dann muss ich nur herausfinden, wie Sie die sukzessive Zeile hinzufügen.

+0

@stevb hier ist ein wenig mehr Informationen – Brett

Verwandte Themen