R - Об'єднайте два фрейми даних?


129

З огляду на два dataframes aі 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

Чи є простий спосіб їх об'єднання, щоб повернути новий кадр даних форми нижче?

> 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

Я хочу об'єднати рамки даних, узгодити заголовки та вставити NAмісця для кадрів у кадрі даних, bде заголовок відсутній.


3
Я припускаю, що ви вже пробували merge()? Чому це не працює?
Андріє

2
Я не Андрі, - тож поставить +1 тобі за те, що я змусив мене піти!
Даррен Дж. Фіцпатрік

16
Я збентежений. Операція Даррена не є об'єднанням - немає "декартового продукту". Скоріше, це пряма конкатенація. Отже, як допомагають з'єднання?
dfrankow

Відповіді:


225

Ви хочете "rbind".

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

rbind вимагає, щоб кадри даних мали однакові стовпці.

Перший рядок додає стовпчик b до кадру даних b.

Результати

> 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
Якщо ви Reduce(rbind, list_of_data_frames)об'єднали більше 2-х фреймів даних, ви можете їх збивати разом!
Yourpalal

1
якщо ви rbindїдете з бази з якоїсь дивної причини: я використавrbind.data.frame
Boern

34

Спробуйте пакет plyr :

rbind.fill(a,b,c)

9
Уникайте використання зовнішніх пакетів для простих завдань.
Фернандо

24
Чіткіше і простіше, ніж злом у додаткових стовпцях, просто щоб догодити rbind; це правильний шлях вперед. Уникати надзвичайно поширених пакетів, наприклад, plyrколи вони пропонують потрібні інструменти для роботи, просто не є розумним.
Джек Едлі

2
Ця функція автоматично виконує об'єднання фактора. Це значно краще, ніж прийнята відповідь. plyrце жахливий загальний пакет.
HelloWorld

23

ви можете використовувати функцію

bind_rows(a,b)

з бібліотеки dplyr


2
На відміну від cbind ( rbind), ця функція не змінює тип усіх стовпців (рядків) на, factorякщо присутній вектор символів.
Азім

11

Ось проста маленька функція, яка буде перев’язувати два набори даних разом після автоматичного визначення того, які стовпці відсутні у кожного та додавання їх до всіх NA s.

З будь-якої причини це повертає МНОГО швидше на більших наборах даних, ніж використання 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
Ця маленька функція є динамітом.
Дірк

Приємно. Я просто хотів опублікувати ту саму відповідь :-). Одне вдосконалення: @Anton підкреслив NAце doubleу своїй відповіді. Було б непогано, коли тип нового стовпця був того ж типу, що і існуючий стовпець в іншому кадрі даних. Можливо, через mode(d2[d2.add[i]]) <- mode(d1[d2.add[i]]). Але я не впевнений, чи це правильний шлях.
daniel.heydebreck

3

Ви можете використовувати, rbindале в цьому випадку вам потрібно мати однакову кількість стовпців в обох таблицях, тому спробуйте наступне:

b$b<-as.double(NA) #keeping numeric format is essential for further calculations
new<-rbind(a,b)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.