前言
通常我们用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一样,无关紧要。但最好还是相同顺序吧。
网友评论