如何将新行从一个数据帧绑定到 R 中的现有数据帧

How to rbind new rows from one data frame to an existing data frame in R

我想知道如何根据每个 table 中的唯一值将新数据(行)从一个数据框 df2 附加到现有数据框 df1。所以我有一个现有的数据框 df1,它有历史数据,每一行都有一个唯一的值。然后我从网络上提取数据并将其放入一个新的数据框架 df2 中。新数据框还包含一个唯一值,它可能与 df1 中的唯一值匹配,也可能不匹配。

我想获取 df2 中所有具有 df1 中不存在的唯一值的行,并将这些行附加到 df1。我最初的想法是使用类似于这样的代码:

ifelse(any(df1$unique_val==df2$unique_val), df1 <- df1, df1 <- rbind(df2, df1))

但后来我意识到我需要比 "any" 匹配更一对一的匹配。我知道如何使用 UNION 和 WHERE 子句在 SQL 中执行此操作,但我不确定如何使其在 R 中工作。我能找到的唯一相关研究是附加来自两个数据框的所有数据或将新列附加到现有数据框。

下面的例子展示了我在寻找什么以及为什么我不寻找"join"这两个数据框

df1 = data.frame(numb = c(1:6), rand = c(rep("Toaster",6)))

df1$unique_val <- paste0(df1$numb, df1$rand)

> df1 numb rand unique_val 1 1 Toaster 1Toaster 2 2 Toaster 2Toaster 3 3 Toaster 3Toaster 4 4 Toaster 4Toaster 5 5 Toaster 5Toaster 6 6 Toaster 6Toaster

df2 = data.frame(numb = c(5:7), rand = c(rep("Toaster",2), c(rep("Radio",1))))

df2$unique_val <- paste0(df2$numb, df2$rand)

> df2 numb rand unique_val 1 5 Toaster 5Toaster 2 6 Toaster 6Toaster 3 7 Radio 7Radio

如您所见,df2 中的第 3 行是唯一的新行(在 df1 中没有匹配的 unique_val 的行)。我想将这个新行添加到 df1。注意:它并不总是与 df2 中的新行相同。

我使用了来自此 post、merge/join data frames 的每个连接,如下所示:

merge(df1,df2, by = "unique_val")

merge(df1,df2, by = "unique_val", all = TRUE)

merge(df1,df2, by = "unique_val", all.x = TRUE)

merge(df1,df2, by = "unique_val", all.y = TRUE)

我也尝试了 dplyr 的 anti_join:

anti_join(df1,df2, by = "unique_val")

Rbind 给我以下内容:

rbind(df1,df2) numb rand conc 1 1 Toaster 1Toaster 2 2 Toaster 2Toaster 3 3 Toaster 3Toaster 4 4 Toaster 4Toaster 5 5 Toaster 5Toaster 6 6 Toaster 6Toaster 7 5 Toaster 5Toaster 8 6 Toaster 6Toaster 9 7 Radio 7Radio

None 其中给出了以下所需的输出:

numb rand conc 1 1 Toaster 1Toaster 2 2 Toaster 2Toaster 3 3 Toaster 3Toaster 4 4 Toaster 4Toaster 5 5 Toaster 5Toaster 6 6 Toaster 6Toaster 7 7 Radio 7Radio

我正在寻找 rbind 这些数据框,而不是加入它们。

我们可以使用 data.table 中的 rbindlist/unique。我们将数据集放在 list 中,使用 rbindlist(来自 data.table)将 list 中的数据集绑定到单个 data.table 并得到 uniqueunique 来自 data.table 也有 by 选项来指定变量。

library(data.table)
unique(rbindlist(list(df1, df2)), by = "numb")
#   numb    rand unique_val
#1:    1 Toaster   1Toaster
#2:    2 Toaster   2Toaster
#3:    3 Toaster   3Toaster
#4:    4 Toaster   4Toaster
#5:    5 Toaster   5Toaster
#6:    6 Toaster   6Toaster
#7:    7   Radio     7Radio