R - Nối hai dataframes?


129

Cho hai datafram ab:

> 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

Có cách nào đơn giản để ghép nối chúng để trả về khung dữ liệu mới của biểu mẫu bên dưới không?

> 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

Tôi muốn hợp nhất các dataframes, khớp với các tiêu đề và chèn NAvào cho các vị trí trong khung dữ liệu bmà tiêu đề bị thiếu.


3
Tôi đoán bạn đã thử đã thử merge()? Tại sao điều đó không làm việc?
Andrie

2
Tôi đã không Andrie - vì vậy sẽ +1 bạn vì đã khiến tôi đi!
Darren J. Fitzpatrick

16
Tôi bối rối. Hoạt động của Darren không phải là một sự tham gia-- không có "sản phẩm cartesian". Thay vào đó, nó là một sự kết hợp thẳng. Vậy làm thế nào để tham gia giúp đỡ?
dfrankow

Câu trả lời:


225

Bạn muốn "rbind".

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

rbind yêu cầu các khung dữ liệu phải có cùng cột.

Dòng đầu tiên thêm cột b vào khung dữ liệu b.

Các kết quả

> 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
Nếu bạn nhận được sự kết hợp của hơn 2 khung dữ liệu, bạn có thể sử dụng Reduce(rbind, list_of_data_frames)để kết hợp tất cả chúng lại với nhau!
Yourpalal

1
nếu bạn rbindđến từ căn cứ vì một lý do kỳ lạ: Tôi đã sử dụngrbind.data.frame
Boern

34

Hãy thử gói plyr :

rbind.fill(a,b,c)

9
Tránh sử dụng các gói bên ngoài cho các nhiệm vụ đơn giản.
Fernando

23
Rõ ràng và dễ dàng hơn việc hack trong các cột bổ sung chỉ để làm hài lòng mọi người; Đây là cách đúng đắn về phía trước. Tránh các gói cực kỳ phổ biến như plyrkhi nó cung cấp các công cụ phù hợp cho công việc đơn giản là không hợp lý.
Jack Aidley

2
Chức năng này tự động thực hiện việc hợp nhất các yếu tố. Nó tốt hơn đáng kể so với câu trả lời được chấp nhận. plyrlà một gói chung khủng khiếp.
HelloWorld

23

bạn có thể sử dụng chức năng

bind_rows(a,b)

từ thư viện dplyr


2
Không giống như cbind ( rbind), hàm này không thay đổi loại của tất cả các cột (hàng) thành factornếu có một vectơ ký tự.
Azim

11

Đây là một hàm nhỏ đơn giản sẽ gắn kết hai bộ dữ liệu lại với nhau sau khi tự động phát hiện những cột nào bị thiếu trong mỗi cột và thêm chúng với tất cả NAs.

Vì bất kỳ lý do gì, điều này trả về NHIỀU nhanh hơn trên các bộ dữ liệu lớn hơn so với sử dụng mergehàm.

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
Chức năng nhỏ này là thuốc nổ.
Dirk

Đẹp. Tôi chỉ muốn đăng câu trả lời tương tự :-). Một cải tiến: @Anton bỏ NAqua doublecâu trả lời của mình. Sẽ thật tuyệt khi loại cột mới cùng loại với cột hiện có trong khung dữ liệu khác. Có lẽ thông qua mode(d2[d2.add[i]]) <- mode(d1[d2.add[i]]). Nhưng tôi không chắc liệu đây có phải là cách thích hợp.
daniel.heydebreck

3

Bạn có thể sử dụng rbindnhưng trong trường hợp này bạn cần có cùng số lượng cột trong cả hai bảng, vì vậy hãy thử các cách sau:

b$b<-as.double(NA) #keeping numeric format is essential for further calculations
new<-rbind(a,b)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.