R - İki veri çerçevesi birleştirilsin mi?


129

İki veri çerçevesi verildiğinde ave 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

Aşağıdaki formun yeni bir veri çerçevesini döndürmek için bunları birleştirmenin basit bir yolu var mı?

> 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

Veri çerçevelerini birleştirmek, üstbilgileri eşleştirmek ve başlığın eksik olduğu veri çerçevesindeki NAkonumlar için eklemek istiyorum b.


3
Zaten denediğini varsayıyorum merge()? Bu neden çalışmıyor?
Andrie

2
Andrie yapmadım - bu yüzden beni aptal durumuna düşürdüğün için seni + 1'leyeceğim!
Darren J. Fitzpatrick

16
Kafam karıştı. Darren'ın operasyonu bir birleştirme değildir - "kartezyen ürün" yoktur. Aksine, düz bir bitiştirme. Peki birleşimler nasıl yardımcı olur?
dfrankow

Yanıtlar:


225

"Rbind" istiyorsun.

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

rbind, veri çerçevelerinin aynı sütunlara sahip olmasını gerektirir.

İlk satır, veri çerçevesi b'ye sütun b ekler.

Sonuçlar

> 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

9
2'den fazla veri çerçevesinin birleşimini elde ediyorsanız, Reduce(rbind, list_of_data_frames)hepsini bir araya getirmek için kullanabilirsiniz!
Yourpalal

1
Eğer eğer rbindbazı garip nedenle tabanından geliyor: Kullandığımrbind.data.frame
Boern

34

Plyr paketini deneyin :

rbind.fill(a,b,c)

9
Basit görevler için harici paketler kullanmaktan kaçının.
Fernando

24
Lütfen derlemek için fazladan sütunları hacklemekten daha açık ve daha kolay; bu ileriye doğru doğru yoldur. plyrİş için doğru araçları sunduğu zamanki gibi son derece yaygın paketlerden kaçınmak hiç mantıklı değildir.
Jack Aidley

2
Bu işlev, faktör birleştirmeyi otomatik olarak yapar. Kabul edilen cevaptan önemli ölçüde daha iyi. plyrberbat bir ortak paket.
HelloWorld

23

işlevi kullanabilirsiniz

bind_rows(a,b)

dan dplyr kütüphanesinden


2
cbind ( rbind) ' Den farklı olarak , bu işlev factorbir karakter vektörü mevcutsa tüm sütunların (satırların) türünü değiştirmez .
Azim

11

İşte, her birinde hangi sütunların eksik olduğunu otomatik olarak tespit edip bunları tüm URL'lerle ekledikten sonra iki veri kümesini birbirine bağlayacak basit bir küçük işlev NA.

Sebep ne olursa olsun bu , işlevi kullanmaktan daha büyük veri kümelerinde ÇOK daha hızlı döndürür 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))
}

1
Bu küçük işlev dinamittir.
Dirk

Güzel. Ben sadece aynı cevabı göndermek istedim :-). Bir iyileştirme: @Anton cevabında NAto doubleattı. Yeni sütunun türünün diğer veri çerçevesindeki mevcut sütunla aynı türde olması güzel olurdu. Belki yoluyla mode(d2[d2.add[i]]) <- mode(d1[d2.add[i]]). Ancak bunun uygun bir yol olup olmadığından emin değilim.
daniel.heydebreck

3

Kullanabilirsiniz, rbindancak bu durumda her iki tabloda da aynı sayıda sütuna sahip olmanız gerekir, bu nedenle aşağıdakileri deneyin:

b$b<-as.double(NA) #keeping numeric format is essential for further calculations
new<-rbind(a,b)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.