R – Twee dataframes samenvoegen?

Gegeven twee dataframes aen 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

Is er een eenvoudige manier om deze samen te voegen om een nieuw gegevensframe van het onderstaande formulier te retourneren?

> 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

Ik wil de dataframes samenvoegen, de headers matchen en NAinvoegen voor posities in dataframe bwaar de header ontbreekt.


Antwoord 1, autoriteit 100%

U wilt “rbind”.

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

rbind vereist dat de dataframes dezelfde kolommen hebben.

De eerste regel voegt kolom b toe aan dataframe b.

Resultaten

> 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

Antwoord 2, autoriteit 14%

Probeer het plyr-pakket:

rbind.fill(a,b,c)

Antwoord 3, autoriteit 11%

u kunt de functie gebruiken

bind_rows(a,b)

uit de dplyrbibliotheek


Antwoord 4, autoriteit 5%

Hier is een eenvoudige kleine functie die twee datasets samenbindt nadat automatisch is gedetecteerd welke kolommen in elk ontbreken en deze worden toegevoegd met alle NAen.

Om welke reden dan ook, retourneert dit VEELsneller op grotere datasets dan met de functie merge.

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))
}

Antwoord 5, autoriteit 2%

Je mag rbindgebruiken, maar in dit geval moet je hetzelfde aantal kolommen in beide tabellen hebben, dus probeer het volgende:

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

Other episodes