在 R 中合併兩個 Data Frame

Gustavo du Mortier 2023年1月30日
  1. 在 R 中使用 rbind 來合併兩個 Data Frame
  2. 使用 dplyr 軟體包
  3. 在 R 中組合大型 data frame
在 R 中合併兩個 Data Frame

在用 R 程式碼運算元據時,我們經常會面臨將兩個 Data Frame 合併成一個 Data Frame 的需求。本教程將看到一些在 R 中高效組合兩個 Data Frame 的方法。

假設你有兩個 Data Frame,xy,有一些匹配的列。例如:

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 可以像這樣的。

Rdata frame 示例

在 R 中使用 rbind 來合併兩個 Data Frame

rbind 函式將資料結構,如 data frame、向量或矩陣,按行組合起來。它的名字代表行繫結。

當使用 rbind 組合兩個 data frame 時,兩個 data frame 需要有相同的列。因此,在前面的例子中,你需要將 b 列新增到 data frame y 中。可以通過執行這個命令來完成。

y$b <- NA

現在 data frame y 應該是這樣的。

R data frame 示例

現在你可以通過執行這個命令,使用 rbindxy 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)

它用 xy 的組合填充 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

相關文章 - R Data Frame