R-두 개의 데이터 프레임을 연결 하시겠습니까?


129

이 dataframes을 감안할 때 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

아래 양식의 새 데이터 프레임을 반환하기 위해 이들을 연결하는 간단한 방법이 있습니까?

> 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()합니까? 왜 작동하지 않습니까?
Andrie

2
나는 안드리가 아니었다-그래서 내가 당신을 도게 해줘서 +1 할 것이다!
대런 제이 피츠 패트릭

16
혼란 스러워요. 대런의 수술은 조인이 아닙니다. "카테 시안 제품"은 없습니다. 오히려, 그것은 바로 연결입니다. 그렇다면 조인은 어떻게 도움이됩니까?
dfrankow

답변:


225

"바인딩"을 원합니다.

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
2 개 이상의 데이터 프레임을 통합 한 경우 Reduce(rbind, list_of_data_frames)이를 사용 하여 모두 합칠 수 있습니다!
Yourpalal

1
rbind이상한 이유로 당신이 기지에서 오는 경우 : 나는 사용rbind.data.frame
Boern

34

plyr 패키지를 사용해보십시오 :

rbind.fill(a,b,c)

9
간단한 작업에는 외부 패키지를 사용하지 마십시오.
Fernando

23
추가 열을 해킹하는 것보다 명확하고 쉬운 방법은 rbind를 기쁘게하기위한 것입니다. 이것이 올바른 방법입니다. plyr작업에 적합한 도구를 제공 할 때 와 같이 매우 일반적인 패키지를 피하는 것은 합리적이지 않습니다.
Jack Aidley

2
이 기능은 인자 병합을 자동으로 수행합니다. 허용 된 답변보다 훨씬 낫습니다. plyr끔찍한 공통 패키지입니다.
HelloWorld

23

당신은 기능을 사용할 수 있습니다

bind_rows(a,b)

로부터 dplyr의 라이브러리


2
cbind ( rbind) 와 달리이 함수는 factor문자 벡터가있는 경우 모든 열 (행)의 유형을 변경하지 않습니다 .
Azim

11

다음은 각 열에서 누락 된 열을 자동 감지하고 모든 열을 추가 한 후 두 데이터 집합을 결합하는 간단한 작은 기능입니다. NA .

어떤 이유로 든 이것은 함수를 사용하는 것보다 큰 데이터 세트에서 MUCH를 더 빠르게 반환 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
이 작은 기능은 다이너마이트입니다.
Dirk

좋은. 방금 같은 대답을 게시하고 싶었습니다 :-). 한 가지 개선 사항 : @Anton이 대답으로 NAto 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.