1566 Stimmen

Zusammenführen von Datenrahmen (innen, außen, links, rechts)

Gegeben sind zwei Datenrahmen:

df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)))
df2 = data.frame(CustomerId = c(2, 4, 6), State = c(rep("Alabama", 2), rep("Ohio", 1)))

df1
#  CustomerId Product
#           1 Toaster
#           2 Toaster
#           3 Toaster
#           4   Radio
#           5   Radio
#           6   Radio

df2
#  CustomerId   State
#           2 Alabama
#           4 Alabama
#           6    Ohio

Wie kann ich den Datenbankstil, d.h., sql-stil, joins ? Das heißt, wie bekomme ich:

  • Eine innere Verknüpfung de df1 y df2 :
    Gibt nur die Zeilen zurück, in denen die linke Tabelle übereinstimmende Schlüssel in der rechten Tabelle hat.
  • Eine äußere Verbindung de df1 y df2 :
    Gibt alle Zeilen aus beiden Tabellen zurück, verbindet Datensätze aus der linken Tabelle, die übereinstimmende Schlüssel in der rechten Tabelle haben.
  • A Left Outer Join (oder einfach Left Join) de df1 y df2
    Gibt alle Zeilen aus der linken Tabelle und alle Zeilen mit übereinstimmenden Schlüsseln aus der rechten Tabelle zurück.
  • A rechte äußere Verbindung de df1 y df2
    Gibt alle Zeilen aus der rechten Tabelle und alle Zeilen mit übereinstimmenden Schlüsseln aus der linken Tabelle zurück.

Extra Kredit:

Wie kann ich eine SQL-ähnliche Select-Anweisung ausführen?

2 Stimmen

Der Spickzettel "Data Transformation with dplyr", der von RStudio erstellt und gepflegt wird, enthält auch schöne Infografiken darüber, wie Joins in dplyr funktionieren rstudio.com/resources/cheatsheets

5 Stimmen

Wenn Sie stattdessen hierher gekommen sind, um etwas über die Zusammenlegung von Pandas Dataframes, diese Ressource kann gefunden werden aquí .

1 Stimmen

Für @isomorphismes Link ist hier eine aktuelle archivierte Version: web.archive.org/web/20190312112515/http://stat545.com/…

13voto

sanjeeb Punkte 163
  1. Verwendung von merge Funktion können wir die Variable der linken Tabelle oder der rechten Tabelle auswählen, so wie wir alle mit der Select-Anweisung in SQL vertraut sind (EX : Select a.* ...oder Select b.* from .....)
  2. Wir müssen zusätzlichen Code hinzufügen, der eine Untermenge aus der neu verbundenen Tabelle bildet.

    • SQL :- select a.* from df1 a inner join df2 b on a.CustomerId=b.CustomerId

    • R :- merge(df1, df2, by.x = "CustomerId", by.y = "CustomerId")[,names(df1)]

Gleicher Weg

  • SQL :- select b.* from df1 a inner join df2 b on a.CustomerId=b.CustomerId

  • R :- merge(df1, df2, by.x = "CustomerId", by.y = "CustomerId")[,names(df2)]

12voto

Jaap Punkte 76587

Für eine innere Verknüpfung mit allen Spalten können Sie auch fintersect von der Daten.Tabelle -Paket oder intersect von der dplyr -Paketes als Alternative zu merge ohne die Angabe der by -Kolumnen. Dies ergibt die Zeilen, die zwischen zwei Datenrahmen gleich sind:

merge(df1, df2)
#   V1 V2
# 1  B  2
# 2  C  3

dplyr::intersect(df1, df2)
#   V1 V2
# 1  B  2
# 2  C  3

data.table::fintersect(setDT(df1), setDT(df2))
#    V1 V2
# 1:  B  2
# 2:  C  3

Beispielhafte Daten:

df1 <- data.frame(V1 = LETTERS[1:4], V2 = 1:4)
df2 <- data.frame(V1 = LETTERS[2:3], V2 = 2:3)

12voto

Frank Punkte 64882

Update verbinden. Eine weitere wichtige SQL-Verknüpfung ist eine " Update verbinden ", bei dem Spalten in einer Tabelle mit Hilfe einer anderen Tabelle aktualisiert (oder erstellt) werden.

Modifizierung der Beispieltabellen des Auftraggebers...

sales = data.frame(
  CustomerId = c(1, 1, 1, 3, 4, 6), 
  Year = 2000:2005,
  Product = c(rep("Toaster", 3), rep("Radio", 3))
)
cust = data.frame(
  CustomerId = c(1, 1, 4, 6), 
  Year = c(2001L, 2002L, 2002L, 2002L),
  State = state.name[1:4]
)

sales
# CustomerId Year Product
#          1 2000 Toaster
#          1 2001 Toaster
#          1 2002 Toaster
#          3 2003   Radio
#          4 2004   Radio
#          6 2005   Radio

cust
# CustomerId Year    State
#          1 2001  Alabama
#          1 2002   Alaska
#          4 2002  Arizona
#          6 2002 Arkansas

Angenommen, wir wollen den Status des Kunden aus cust zur Tabelle der Einkäufe, sales ohne Berücksichtigung der Jahresspalte. Mit Base R können wir übereinstimmende Zeilen identifizieren und dann Werte rüberkopieren:

sales$State <- cust$State[ match(sales$CustomerId, cust$CustomerId) ]

# CustomerId Year Product    State
#          1 2000 Toaster  Alabama
#          1 2001 Toaster  Alabama
#          1 2002 Toaster  Alabama
#          3 2003   Radio     <NA>
#          4 2004   Radio  Arizona
#          6 2005   Radio Arkansas

# cleanup for the next example
sales$State <- NULL

Wie hier zu sehen ist, match wählt die erste passende Zeile aus der Kundentabelle aus.


Update Join mit mehreren Spalten. Der obige Ansatz funktioniert gut, wenn wir nur eine einzige Spalte verbinden und mit der ersten Übereinstimmung zufrieden sind. Angenommen, das Jahr der Messung in der Kundentabelle soll mit dem Jahr des Verkaufs übereinstimmen.

Wie in der Antwort von @bgoldst erwähnt, match avec interaction könnte eine Option für diesen Fall sein. Einfacher wäre es, data.table zu verwenden:

library(data.table)
setDT(sales); setDT(cust)

sales[, State := cust[sales, on=.(CustomerId, Year), x.State]]

#    CustomerId Year Product   State
# 1:          1 2000 Toaster    <NA>
# 2:          1 2001 Toaster Alabama
# 3:          1 2002 Toaster  Alaska
# 4:          3 2003   Radio    <NA>
# 5:          4 2004   Radio    <NA>
# 6:          6 2005   Radio    <NA>

# cleanup for next example
sales[, State := NULL]

Rolling Update beitreten. Alternativ kann auch der letzte Zustand des Kunden herangezogen werden, in dem er angetroffen wurde:

sales[, State := cust[sales, on=.(CustomerId, Year), roll=TRUE, x.State]]

#    CustomerId Year Product    State
# 1:          1 2000 Toaster     <NA>
# 2:          1 2001 Toaster  Alabama
# 3:          1 2002 Toaster   Alaska
# 4:          3 2003   Radio     <NA>
# 5:          4 2004   Radio  Arizona
# 6:          6 2005   Radio Arkansas

Die drei obigen Beispiele beziehen sich alle auf das Erstellen/Hinzufügen einer neuen Spalte. Siehe die zugehörige R-FAQ für ein Beispiel zur Aktualisierung/Änderung einer bestehenden Spalte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X