Fügen Sie zwei Datenframes mit ungleichen Zeilen und Spalten hinzu (nicht zusammenführen!)

8

Ich möchte die Einträge von zwei Datenrahmen effizient summieren, obwohl die Datenrahmen nicht garantiert die gleichen Dimensionen oder Spaltennamen haben. Merge ist nicht das, wonach ich hier bin. Stattdessen möchte ich ein Ausgabeobjekt mit allen Zeilen- und Spaltennamen erstellen, die zu einem der hinzugefügten Datenrahmen gehören. In jeder Position dieses Ausgangs möchte ich die folgende Logik für den berechneten Wert verwenden:

  • Wenn eine Zeilen / Spalten-Paarung zu beiden Eingabedatenrahmen gehört, möchte ich, dass die Ausgabe ihre Summe enthält
  • Wenn eine Zeilen / Spalten-Paarung zu nur einem Eingabedatenrahmen gehört, möchte ich diesen Wert in die Ausgabe
  • aufnehmen
  • Wenn eine Zeilen / Spalten-Paarung zu keiner Eingabematrix gehört, möchte ich 0 an dieser Position in der Ausgabe haben.

Betrachten Sie als Beispiel die folgenden Eingabedatenrahmen:

%Vor%

Ich möchte, dass das Endergebnis

ist %Vor%

Was ich bisher gemacht habe -

bind_rows / bind_cols in dplyr kann folgendes werfen:  "Fehler: Inkompatible Anzahl der Zeilen (3, erwartet 2)"

Ich habe Spaltennamen dupliziert, so dass "merge" auch nicht für meine Zwecke funktioniert - gibt aus irgendeinem Grund ein leeres df zurück.

    
Jeff Shane 02.02.2016, 20:16
quelle

5 Antworten

4

Scheint so, als könntest du bei den rownames fusionieren, dann kümmerst du dich um die Summen und die Umwandlung von NA auf null mit etwas zusätzlicher Munging:

%Vor%

Oder mit @ DavidArenburgs viel eleganter und erweiterbarer Lösung:

%Vor%     
eipi10 02.02.2016, 20:35
quelle
3

Dies scheint wie eine Art von einfacher Zusammenführung bei gemeinsamen Spaltennamen (+ Zeilennamen) und dann eine einfache Aggregation, so würde ich das angehen

%Vor%

Sind eine ziemlich einfache Basis-R-Lösung

%Vor%     
David Arenburg 02.02.2016 21:00
quelle
2

Zuerst würde ich mir die Namen aller Zeilen und Spalten der neuen Entität nehmen:

%Vor%

Dann würde ich eine Ausgabematrix mit diesen Zeilen- und Spaltennamen konstruieren (wobei Matrixdaten für alle 0 initialisiert werden), indem df1 und df2 zu den relevanten Teilen dieser Matrix hinzugefügt werden.

%Vor%     
josliber 02.02.2016 20:24
quelle
1

Verwendung von xtabs auf geschmolzenen / gestapelten Datenrahmen:

%Vor%     
thelatemail 02.02.2016 23:55
quelle
0

Ich bin nicht davon überzeugt, dass die akzeptierte (oder alternative Merge) -Methode die beste ist. Es gibt falsche Ergebnisse, wenn Sie gemeinsame Zeilen haben, sie werden verbunden und nicht summiert.

Dies kann trivial angezeigt werden, indem df2 in:

geändert wird %Vor%

erwartete Ergebnisse:

%Vor%

tatsächliche Ergebnisse

%Vor%

Sie müssen sowohl den äußeren als auch den inneren Join kombinieren (oder Links / Rechts-Joins, alle verschmelzen = T / all = F). Oder alternativ mit plars rbind.fill:

Basis-R-Lösung

%Vor%

Datentabelle Lösung

%Vor%

Ich bevorzuge die Methode rbind.fill, da Sie & gt; 2 Datenrahmen mit der gleichen Syntax.

    
Greg 16.03.2018 15:46
quelle

Tags und Links