R – Concatenarea a două cadre de date? (Programare, R, Dataframe, Concatenare)

Darren J. Fitzpatrick a intrebat.

Având în vedere două cadre de date a și 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

Există o modalitate simplă de a le concatena astfel încât să se întoarcă un nou cadru de date de forma de mai jos?

> 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

Doresc să îmbin cadrele de date, să potrivesc antetele și să introduc NA în pentru pozițiile din cadrul de date b în care lipsește antetul.

Comentarii

  • Presupun că ați încercat deja merge()? De ce nu funcționează? –  > Por Andrie.
  • Nu am făcut-o Andrie – așa că va +1 tu pentru că m-ai făcut să merg doh! –  > Por Darren J. Fitzpatrick.
  • 17

  • Sunt confuz. Operațiunea lui Darren nu este o îmbinare – nu există un „produs cartezian”. Mai degrabă, este o concatenare directă. Deci, cum ajută îmbinările? –  > Por dfrankow.
5 răspunsuri
dfrankow

Vrei „rbind”.

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

rbind necesită ca cadrele de date să aibă aceleași coloane.

Prima linie adaugă coloana b la cadrul de date b.

Rezultate

> 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

Comentarii

  • Dacă obțineți uniunea a mai mult de 2 cadre de date, puteți utiliza Reduce(rbind, list_of_data_frames) pentru a le amesteca pe toate împreună! –  > Por Yourpalal.
  • dacă sunteți rbind provine din bază dintr-un motiv ciudat: am folosit rbind.data.frame –  > Por Boern.
Rnoob

Încercați plyr pachet:

rbind.fill(a,b,c)

Comentarii

  • Evitați să utilizați pachete externe pentru sarcini simple. –  > Por Fernando.
  • 24

  • Mai clar și mai ușor decât să introducem coloane suplimentare doar pentru a mulțumi rbind; aceasta este calea corectă de urmat. Evitarea pachetelor extrem de comune, cum ar fi plyr atunci când oferă instrumentele potrivite pentru această sarcină, este pur și simplu lipsită de sens. –  > Por Jack Aidley.
  • Această funcție face automat fuziunea factorilor. Este semnificativ mai bună decât răspunsul acceptat. plyr este un pachet îngrozitor de comun. –  > Por SmallChess.
Adam Lee Perelman

puteți utiliza funcția

bind_rows(a,b)

din pachetul dplyr

Comentarii

  • Spre deosebire de cbind (rbind), această funcție nu schimbă tipul tuturor coloanelor (rândurilor) în factor dacă este prezent un vector de caractere. –  > Por Azim.
Mike Monteiro

Iată o funcție mică și simplă care va rbind două seturi de date împreună, după ce va detecta automat ce coloane lipsesc din fiecare și le va adăuga cu toate coloanele NAs.

Indiferent de motiv, acest lucru returnează MULT mai rapid pe seturi de date mai mari decât utilizarea funcției merge funcție.

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

Comentarii

  • Această mică funcție este dinamită. –  > Por Dirk.
  • Frumos. Am vrut doar să postez același răspuns 🙂 . O îmbunătățire: @Anton a turnat NA la double în răspunsul său. Ar fi bine dacă tipul noii coloane ar fi același tip ca și cel al coloanei existente în celălalt cadru de date. Poate prin mode(d2[d2.add[i]]) <- mode(d1[d2.add[i]]). Dar nu sunt sigur că aceasta este calea potrivită. –  > Por daniel.heydebreck.
Anton

Puteți folosi rbind dar, în acest caz, trebuie să aveți același număr de coloane în ambele tabele, așa că încercați următoarele:

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