R - Połączyć dwie ramki danych?

129

Biorąc pod uwagę dwie ramki danych ai 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

Czy istnieje prosty sposób na połączenie ich w celu zwrócenia nowej ramki danych z poniższego formularza?

> 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

Chcę scalić ramki danych, dopasować nagłówki i wstawić NApozycje w ramce danych, w bktórych brakuje nagłówka.

Darren J. Fitzpatrick
źródło
3
Zakładam, że próbowałeś już próbowałeś merge()? Dlaczego to nie działa?
Andrie
2
Nie zrobiłem Andrie - więc daję ci +1 za zmuszanie mnie do działania!
Darren J. Fitzpatrick
16
Jestem zmieszany. Operacja Darrena nie jest łączeniem - nie ma „produktu kartezjańskiego”. Jest to raczej zwykła konkatenacja. Jak więc pomagają połączenia?
dfrankow

Odpowiedzi:

225

Chcesz "rbind".

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

rbind wymaga, aby ramki danych miały te same kolumny.

Pierwsza linia dodaje kolumnę b do ramki danych b.

Wyniki

> 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
źródło
9
Jeśli otrzymujesz połączenie więcej niż 2 ramek danych, możesz użyć ich Reduce(rbind, list_of_data_frames)do zmiksowania ich wszystkich!
Yourpalal
1
jeśli rbindprzyjeżdżasz z bazy z jakiegoś dziwnego powodu: użyłemrbind.data.frame
Boern
34

Wypróbuj pakiet Plyr :

rbind.fill(a,b,c)
Rnoob
źródło
9
Unikaj używania zewnętrznych pakietów do prostych zadań.
Fernando,
23
Jaśniejsze i łatwiejsze niż włamywanie się do dodatkowych kolumn tylko po to, by skręcić; to jest właściwa droga naprzód. Unikanie niezwykle powszechnych pakietów, na przykład plyroferujących odpowiednie narzędzia do pracy, jest po prostu niecelowe.
Jack Aidley
2
Ta funkcja automatycznie łączy czynniki. To znacznie lepsze niż zaakceptowana odpowiedź. plyrto okropny wspólny pakiet.
HelloWorld
23

możesz użyć funkcji

bind_rows(a,b)

z biblioteki dplyr

Adam Lee Perelman
źródło
2
W przeciwieństwie do cbind ( rbind), ta funkcja nie zmienia typu wszystkich kolumn (wierszy) na factorjeśli obecny jest wektor znaków.
Azim
11

Oto prosta mała funkcja, która połączy ze sobą dwa zbiory danych po automatycznym wykryciu, których kolumn brakuje w każdym i dodaniu ich do wszystkich NAs.

Z jakiegoś powodu zwraca to DUŻO szybciej w przypadku większych zbiorów danych niż użycie mergefunkcji.

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
źródło
1
Ta mała funkcja to dynamit.
Dirk,
Miły. Chciałem tylko opublikować tę samą odpowiedź :-). Jedno ulepszenie: @Anton rzucił „ NAdo” doublew swojej odpowiedzi. Byłoby miło, gdyby typ nowej kolumny był tego samego typu, co istniejąca kolumna w innej ramce danych. Może przez mode(d2[d2.add[i]]) <- mode(d1[d2.add[i]]). Ale nie jestem pewien, czy jest to właściwy sposób.
daniel.heydebreck
3

Możesz użyć, rbindale w tym przypadku musisz mieć taką samą liczbę kolumn w obu tabelach, więc spróbuj wykonać następujące czynności:

b$b<-as.double(NA) #keeping numeric format is essential for further calculations
new<-rbind(a,b)
Anton
źródło