【R】行或列数目不同的两个数据框如何用rbind/cbind合并?
阅读原文时间:2023年07月09日阅读:1

目录

前言

通常我们用rbind和cbind合并相同行列的数据框。当两个数据框具有不同行列数目时,直接用会报错。

> df1 <- data.frame(a = c(1:5), c = c(6:10));df1
  a  c
1 1  6
2 2  7
3 3  8
4 4  9
5 5 10
> df2 <- data.frame(a = c(11:15), b = c(16:20));df2
   a  b
1 11 16
2 12 17
3 13 18
4 14 19
5 15 20
> rbind(df1,df2)
Error in match.names(clabs, names(xi)) : 名字同原来已有的名字不相对

rbind/cbind对于行列名称一定要相同,顺序可不同,例如:

> df1 <- data.frame(b = c(1:5), a = c(6:10));df1
  b  a
1 1  6
2 2  7
3 3  8
4 4  9
5 5 10
> df2 <- data.frame(a = c(11:15), b = c(16:20));df2
   a  b
1 11 16
2 12 17
3 13 18
4 14 19
5 15 20
> rbind(df1,df2)
    b  a
1   1  6
2   2  7
3   3  8
4   4  9
5   5 10
6  16 11
7  17 12
8  18 13
9  19 14
10 20 15

那么怎么强行合并,即相同部分合并,不同部分用NA取代?

方法一:dplyr的bind_rows

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

方法二:plyr的rbind.fill

> plyr::rbind.fill(df1,df2)
    b  a    c
1   1  6 <NA>
2   2  7 <NA>
3   3  8 <NA>
4   4  9 <NA>
5   5 10 <NA>
6  16 11    A
7  17 12    B
8  18 13    C
9  19 14    D
10 20 15    E

可以看到,行列名可以不同,顺序和rbind一样,无关紧要。但最好还是相同顺序吧。

https://stackoverflow.com/questions/3402371/combine-two-data-frames-by-rows-rbind-when-they-have-different-sets-of-columns