在 R 中合并两个 Data Frame
Gustavo du Mortier
2023年1月30日
2020年12月19日
在用 R 代码操作数据时,我们经常会面临将两个 Data Frame 合并成一个 Data Frame 的需求。本教程将看到一些在 R 中高效组合两个 Data Frame 的方法。
假设你有两个 Data Frame,x
和 y
,有一些匹配的列。例如:
x <- data.frame(a=c(218, 415, 339), b=c(25, 19, 43), c=c(950, 872, 645))
y <- data.frame(a=c(309, 115), c=c(799, 814))
而你需要把它们组合成一个结果 data frame,比如说,叫做 z
。这样的 Data Frame 可以像这样的。
在 R 中使用 rbind
来合并两个 Data Frame
rbind
函数将数据结构,如 data frame、向量或矩阵,按行组合起来。它的名字代表行绑定。
当使用 rbind
组合两个 data frame 时,两个 data frame 需要有相同的列。因此,在前面的例子中,你需要将 b
列添加到 data frame y
中。可以通过执行这个命令来完成。
y$b <- NA
现在 data frame y
应该是这样的。
现在你可以通过执行这个命令,使用 rbind
将 x
和 y
data frame 合并到新的 z
data frame 中。
x <- data.frame(a=c(218, 415, 339), b=c(25, 19, 43), c=c(950, 872, 645))
y <- data.frame(a=c(309, 115), c=c(799, 814))
y$b <- NA
z <- rbind(x, y)
输出:
a b c
1 218 25 950
2 415 19 872
3 339 43 645
4 309 NA 799
5 115 NA 814
使用 dplyr
软件包
如果你不想为了使用 rbind
而编写额外的一行代码或向其中一个 data frame 添加虚构的列,你可以安装 dplyr
包,然后只需使用:
z <- bind_rows(x, y)
它用 x
和 y
的组合填充 z
data frame。
在 R 中组合大型 data frame
前面的例子对于只有几行和 2 或 3 列的小型 data frame 来说,效果不错。但是当你需要合并有很多行和任意列数的大数据集时,最好写一个能更快地完成工作的函数,比如下面这个函数。
quickmerge <- function(df1, df2) {
df1.names <- names(df1)
df2.names <- names(df2)
df2.add <- setdiff(df1.names, df2.names)
df1.add <- setdiff(df2.names, df1.names)
if(length(df2.add) > 0) {
for(i in 1:length(df2.add)) {
df2[df2.add[i]] <- NA
}
}
if(length(df1.add) > 0) {
for(i in 1:length(df1.add)) {
df1[df1.add[i]] <- NA
}
}
return(rbind(df1, df2))
}
这个函数首先比较 data frame 中的列名,然后添加必要的列,使它们相等。最后,它使用 rbind
函数来合并行,并返回结果。调用该函数时,你可以这样使用:
z <- quickmerge(x, y)
完整的示例代码如下:
quickmerge <- function(df1, df2) {
df1.names <- names(df1)
df2.names <- names(df2)
df2.add <- setdiff(df1.names, df2.names)
df1.add <- setdiff(df2.names, df1.names)
if(length(df2.add) > 0) {
for(i in 1:length(df2.add)) {
df2[df2.add[i]] <- NA
}
}
if(length(df1.add) > 0) {
for(i in 1:length(df1.add)) {
df1[df1.add[i]] <- NA
}
}
return(rbind(df1, df2))
}
x <- data.frame(a=c(218, 415, 339), b=c(25, 19, 43), c=c(950, 872, 645))
y <- data.frame(a=c(309, 115), c=c(799, 814))
z <- quickmerge(x, y)
print(z)
输出:
a b c
1 218 25 950
2 415 19 872
3 339 43 645
4 309 NA 799
5 115 NA 814