R - Zwei Datenrahmen verketten?

129

Gegeben zwei Datenrahmen aund b:

> a
           a           b           c
1 -0.2246894 -1.48167912 -1.65099363
2  0.5559320 -0.87898575 -0.15634590
3  1.8469466 -0.01487524 -0.53098215
4 -0.6875051  0.23880967  0.01824621
5 -0.6735163  0.75485292  0.44154092


> b
           a          c
1  0.4287284 -0.3295925
2  0.5201492  0.3341251
3 -2.6355570  1.7916780
4 -1.3645337  1.3642276
5 -0.4954542 -0.6660001

Gibt es eine einfache Möglichkeit, diese zu verketten, um einen neuen Datenrahmen des folgenden Formulars zurückzugeben?

> new
           a                   b           c
1  -0.2246894   -1.48167912106676 -1.65099363
2   0.5559320  -0.878985746842256 -0.15634590
3   1.8469466 -0.0148752354840942 -0.53098215
4  -0.6875051   0.238809666690982  0.01824621
5  -0.6735163   0.754852923524198  0.44154092
6   0.4287284                  NA -0.32959248
7   0.5201492                  NA  0.33412510
8  -2.6355570                  NA  1.79167801
9  -1.3645337                  NA  1.36422764
10 -0.4954542                  NA -0.66600006

Ich möchte die Datenrahmen zusammenführen, die Überschriften abgleichen und NAPositionen im Datenrahmen einfügen, an bdenen die Überschrift fehlt.

Darren J. Fitzpatrick
quelle
3
Ich nehme an, Sie haben es bereits versucht merge()? Warum funktioniert das nicht?
Andrie
2
Ich habe Andrie nicht - also +1 dich dafür, dass du mich dazu gebracht hast, doh zu gehen!
Darren J. Fitzpatrick
16
Ich bin verwirrt. Darrens Operation ist keine Verbindung - es gibt kein "kartesisches Produkt". Es ist eher eine direkte Verkettung. Wie helfen die Joins?
dfrankow

Antworten:

225

Du willst "rbind".

b$b <- NA
new <- rbind(a, b)

Für rbind müssen die Datenrahmen dieselben Spalten haben.

In der ersten Zeile wird Spalte b zum Datenrahmen b hinzugefügt.

Ergebnisse

> a <- data.frame(a=c(0,1,2), b=c(3,4,5), c=c(6,7,8))
> a
  a b c
1 0 3 6
2 1 4 7
3 2 5 8
> b <- data.frame(a=c(9,10,11), c=c(12,13,14))
> b
   a  c
1  9 12
2 10 13
3 11 14
> b$b <- NA
> b
   a  c  b
1  9 12 NA
2 10 13 NA
3 11 14 NA
> new <- rbind(a,b)
> new
   a  b  c
1  0  3  6
2  1  4  7
3  2  5  8
4  9 NA 12
5 10 NA 13
6 11 NA 14
dfrankow
quelle
9
Wenn Sie die Vereinigung von mehr als 2 Datenrahmen erhalten, können Sie Reduce(rbind, list_of_data_frames)sie alle zusammenfügen!
Yourpalal
1
Wenn Sie rbindaus irgendeinem seltsamen Grund von der Basis kommen: Ich haberbind.data.frame
Boern
34

Probieren Sie das Plyr- Paket aus:

rbind.fill(a,b,c)
Rnoob
quelle
9
Vermeiden Sie die Verwendung externer Pakete für einfache Aufgaben.
Fernando
23
Klarer und einfacher als das Hacken in zusätzliche Spalten, nur um bitte zu binden; Das ist der richtige Weg nach vorne. plyrEs ist einfach nicht sinnvoll, extrem häufige Pakete zu vermeiden, wenn sie die richtigen Werkzeuge für den Job bieten.
Jack Aidley
2
Diese Funktion führt automatisch die Faktorzusammenführung durch. Es ist deutlich besser als die akzeptierte Antwort. plyrist ein schreckliches gemeinsames Paket.
HelloWorld
23

Sie können die Funktion verwenden

bind_rows(a,b)

aus der dplyr Bibliothek

Adam Lee Perelman
quelle
2
Im Gegensatz zu cbind ( rbind) ändert diese Funktion nicht den Typ aller Spalten (Zeilen) in, factorwenn ein Vektor von Zeichen vorhanden ist.
Azim
11

Hier ist eine einfache kleine Funktion, die zwei Datensätze zusammenbindet, nachdem automatisch erkannt wurde, welche Spalten in den einzelnen fehlen, und sie mit allen NAs hinzugefügt wurden .

Aus irgendeinem Grund gibt dies bei größeren Datenmengen VIEL schneller zurück als bei Verwendung der mergeFunktion.

fastmerge <- function(d1, d2) {
  d1.names <- names(d1)
  d2.names <- names(d2)

  # columns in d1 but not in d2
  d2.add <- setdiff(d1.names, d2.names)

  # columns in d2 but not in d1
  d1.add <- setdiff(d2.names, d1.names)

  # add blank columns to d2
  if(length(d2.add) > 0) {
    for(i in 1:length(d2.add)) {
      d2[d2.add[i]] <- NA
    }
  }

  # add blank columns to d1
  if(length(d1.add) > 0) {
    for(i in 1:length(d1.add)) {
      d1[d1.add[i]] <- NA
    }
  }

  return(rbind(d1, d2))
}
Mike Monteiro
quelle
1
Diese kleine Funktion ist Dynamit.
Dirk
Nett. Ich wollte nur die gleiche Antwort posten :-). Eine Verbesserung: @Anton gegossenem die NAauf doublein seiner Antwort. Es wäre schön, wenn der Typ der neuen Spalte der gleiche wäre wie die vorhandene Spalte im anderen Datenrahmen. Vielleicht über mode(d2[d2.add[i]]) <- mode(d1[d2.add[i]]). Ich bin mir aber nicht sicher, ob dies der richtige Weg ist.
daniel.heydebreck
3

Sie können verwenden, rbindaber in diesem Fall müssen Sie in beiden Tabellen die gleiche Anzahl von Spalten haben. Versuchen Sie also Folgendes:

b$b<-as.double(NA) #keeping numeric format is essential for further calculations
new<-rbind(a,b)
Anton
quelle