Zähle übereinstimmende Elemente nach Zeilen zwischen zwei Datentabellen in R

8

Ich habe zwei Datenrahmen in R, und ich muss zählen, dass das Element Zeile für Zeile übereinstimmt, um schließlich eine Spalte mit der Länge des kartesischen Produkts beider Tabellen und den IDs beider Zeilen zu erhalten. Außerdem sind die Tabellen recht groß und mit unterschiedlicher Anzahl von Zeilen, aber gleicher Anzahl von Spalten.

Ich habe den folgenden Code, aber es ist ziemlich langsam, wenn mehrere Läufe.

%Vor%

was

ergibt %Vor%     
insu_liko 08.04.2016, 16:20
quelle

5 Antworten

4

Legen Sie die Daten in ein langes Format, da die Reihenfolge der Spalten keine Rolle spielt:

%Vor%

(1) Identifizieren Sie für jeden Wert relevante Paare; und

(2) für Paare, Zählwerte:

%Vor%

Alle anderen (ID1, ID2) Combos sind null und müssen nicht explizit aufgelistet werden, denke ich.

Wenn die Werte wie in dem Beispiel des OP innerhalb jeder Tabelle sind, dann können wir vereinfachen:

%Vor%     
Frank 08.04.2016, 19:04
quelle
3

Angenommen, das Produkt aus der Anzahl der Zeilen und der Anzahl der eindeutigen Werte in beiden Tabellen ist nicht groß:

%Vor%

mit gemeinsamen eindeutigen Werten:

%Vor%

Und tabulate das Auftreten jedes eindeutigen Wertes in jeder Zeile für jede Tabelle:

%Vor%

endlich:

%Vor%

Wenn tab1 und tab2 sehr groß sind, können sie als dünn besetzte Matrizen erstellt werden und eine Möglichkeit könnte sein:

%Vor%

BEARBEITEN

Wenn Sie (1) kleine positive ganzzahlige Werte und (2) unterschiedliche Werte in jeder Zeile haben, können Sie Nachschlagevorgänge mit match / unique / union vermeiden und Tabellierungen vermeiden:

%Vor%     
alexis_laz 08.04.2016 18:41
quelle
2

Wie wäre es mit:

%Vor%

Oder von vorne anfangen:

%Vor%     
eddi 08.04.2016 20:46
quelle
2

Die Leistungsanforderungen sind nicht klar in der Post angegeben. Aber ich habe eine größere Version Ihres reproduzierbaren Beispiels erstellt (unten) und der Code in der Frage ist schon ziemlich schnell.

Hier ist, wie es in der Basis R zu tun ist, für ein gutes Maß:

%Vor%

Zum Beispiel läuft der obige Code für das große reproduzierbare Problem von unten ( dim(out) == c(1e6, 3) ) in weniger als 20 Sekunden.

%Vor%

Bearbeiten Großes reproduzierbares Problem:

%Vor%

Die Lösung des OP läuft viel schneller als diese Antwort

%Vor%

aber die Lösung in Franks Antwort ist noch schneller

%Vor%     
jaimedash 11.04.2016 20:50
quelle
1

Hier ist eine Möglichkeit:

%Vor%     
mrip 08.04.2016 17:15
quelle