[r] 서로 다른 열 집합이있을 때 두 데이터 프레임을 행 (리 바인드)별로 결합

동일한 열 집합이없는 두 개의 데이터 프레임을 행 바인딩 할 수 있습니까? 바인드 후 일치하지 않는 열을 유지하려고합니다.



답변

rbind.fill패키지에서 plyr당신이 찾고있는 것일 수 있습니다.


답변

더 최근의 솔루션을 사용하는 것입니다 dplyrbind_rows내가보다 효율적입니다 가정 기능을 smartbind.

df1 <- data.frame(a = c(1:5), b = c(6:10))
df2 <- data.frame(a = c(11:15), b = c(16:20), c = LETTERS[1:5])
dplyr::bind_rows(df1, df2)
    a  b    c
1   1  6 <NA>
2   2  7 <NA>
3   3  8 <NA>
4   4  9 <NA>
5   5 10 <NA>
6  11 16    A
7  12 17    B
8  13 18    C
9  14 19    D
10 15 20    E


답변

패키지 smartbind에서 사용할 수 있습니다 gtools.

예:

library(gtools)
df1 <- data.frame(a = c(1:5), b = c(6:10))
df2 <- data.frame(a = c(11:15), b = c(16:20), c = LETTERS[1:5])
smartbind(df1, df2)
# result
     a  b    c
1.1  1  6 <NA>
1.2  2  7 <NA>
1.3  3  8 <NA>
1.4  4  9 <NA>
1.5  5 10 <NA>
2.1 11 16    A
2.2 12 17    B
2.3 13 18    C
2.4 14 19    D
2.5 15 20    E


답변

컬럼의 경우 DF1 에 해당하는 서브 세트 DF2 (열 이름으로는)

df3 <- rbind(df1, df2[, names(df1)])


답변

대안 data.table:

library(data.table)
df1 = data.frame(a = c(1:5), b = c(6:10))
df2 = data.frame(a = c(11:15), b = c(16:20), c = LETTERS[1:5])
rbindlist(list(df1, df2), fill = TRUE)

rbind도에서 작동 data.table객체가 변환 될 때만큼 data.table객체 때문에,

rbind(setDT(df1), setDT(df2), fill=TRUE)

이 상황에서도 작동합니다. 이것은 몇 개의 data.tables가 있고 목록을 구성하지 않으려는 경우에 바람직 할 수 있습니다.


답변

대부분의 기본 R 답변은 하나의 data.frame에만 추가 열이 있거나 결과 data.frame이 열의 교차점을 갖는 상황을 해결합니다. OP가 쓰기 때문에 bind 이후에 일치하지 않는 열을 유지하기를 희망 하므로이 문제를 해결하기 위해 기본 R 방법을 사용하는 답변을 게시하는 것이 좋습니다.

아래에는 두 가지 기본 R 방법이 있습니다. 하나는 원래 data.frames를 변경하고 다른 하나는 변경하지 않습니다. 또한 비파괴 적 방법을 두 개 이상의 data.frames로 일반화하는 방법을 제공합니다.

먼저 샘플 데이터를 얻자.

# sample data, variable c is in df1, variable d is in df2
df1 = data.frame(a=1:5, b=6:10, d=month.name[1:5])
df2 = data.frame(a=6:10, b=16:20, c = letters[8:12])

두 개의 data.frames, 원본 변경 두 data.frames의
모든 열을 유지 rbind하고 오류없이 함수가 작동하게하려면 적절한 누락 된 이름으로 채워진 NA 열을 각 data.frame에 추가합니다. 사용하여 setdiff.

# fill in non-overlapping columns with NAs
df1[setdiff(names(df2), names(df1))] <- NA
df2[setdiff(names(df1), names(df2))] <- NA

자, rbind-em

rbind(df1, df2)
    a  b        d    c
1   1  6  January <NA>
2   2  7 February <NA>
3   3  8    March <NA>
4   4  9    April <NA>
5   5 10      May <NA>
6   6 16     <NA>    h
7   7 17     <NA>    i
8   8 18     <NA>    j
9   9 19     <NA>    k
10 10 20     <NA>    l

처음 두 줄은 원래 data.frames, df1 및 df2를 변경하여 전체 열 집합을 둘 다에 추가합니다.


원본
변경하지 않는 두 개의 data.frame 원본 data.frames를 그대로 유지하려면 먼저 다른 이름을 반복하고를 사용하여 data.frame과 함께 목록에 연결된 명명 된 NA 벡터를 반환하십시오 c. 그런 다음 data.frame결과를에 대한 적절한 data.frame으로 변환합니다 rbind.

rbind(
  data.frame(c(df1, sapply(setdiff(names(df2), names(df1)), function(x) NA))),
  data.frame(c(df2, sapply(setdiff(names(df1), names(df2)), function(x) NA)))
)

원본을 변경하지 않는 많은 data.frames 여러 data.frame
이있는 경우 다음을 수행 할 수 있습니다.

# put data.frames into list (dfs named df1, df2, df3, etc)
mydflist <- mget(ls(pattern="df\\d+"))
# get all variable names
allNms <- unique(unlist(lapply(mydflist, names)))

# put em all together
do.call(rbind,
        lapply(mydflist,
               function(x) data.frame(c(x, sapply(setdiff(allNms, names(x)),
                                                  function(y) NA)))))

원래 data.frames의 행 이름을 보지 못하는 것이 더 좋을까요? 그런 다음이 작업을 수행하십시오.

do.call(rbind,
        c(lapply(mydflist,
                 function(x) data.frame(c(x, sapply(setdiff(allNms, names(x)),
                                                    function(y) NA)))),
          make.row.names=FALSE))


답변

공통 열 이름을 가져올 수도 있습니다.

> cols <- intersect(colnames(df1), colnames(df2))
> rbind(df1[,cols], df2[,cols])