我想知道如何根据每个表中的唯一值将一个数据帧df2中的新数据(行)附加到现有数据帧df1。所以我有一个现有的数据框df1,它有历史数据,每行都有一个唯一的值。然后我从网上提取数据并将其放入一个新的数据框df2。新数据框还包含一个唯一值,该值可能与df1中的唯一值匹配,也可能不匹配。
我想在df2中获取具有df1中不存在的唯一值的所有行,并将这些行追加到df1。我最初的想法是使用类似的代码:
ifelse(any(df1$unique_val==df2$unique_val), df1 <- df1, df1 <- rbind(df2, df1))
然后我意识到我需要一个比一个“任何”比赛更多的一对一比赛。我知道如何使用UNION和WHERE子句在SQL中执行此操作,但我不确定如何使其在R中工作。我可以找到研究的唯一相关项目是从两个数据框追加所有数据或添加新数据列到现有数据框。
以下示例显示了我要查找的内容以及为什么我不想“加入”这两个数据框“
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中的新行相同。
我使用了这篇文章中的每个联接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
这些都没有给我以下所需的输出:
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这些数据框,而不是加入它们。
答案 0 :(得分:-1)
我们可以使用rbindlist/unique
中的data.table
。我们将数据集放在list
中,使用rbindlist
(来自data.table
)将list
中的数据集转换为单个data.table
并获取{{ 1}}来自unique
的{{1}}行,其中还有unique
选项来指定变量。
data.table