【发布时间】:2017-01-20 01:07:43
【问题描述】:
我想知道如何根据每个表中的唯一值将新数据(行)从一个数据帧 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 这些数据帧,而不是加入它们。
【问题讨论】:
-
如何使用 unique(rbind(df1,df2))???
-
嗨@Cath,@akrun 解决了我的解决方案。我没有再问同样的问题——我提供了更多详细信息,正如本网站解释的那样,如果您不认为这是一个重复的问题,我仍然不相信它是一个重复的问题。完整阅读我的问题并使用
merge(df1, df2, all.x=TRUE)。它没有提供我希望看到的解决方案,如我的问题中所述。 -
@d84_n1nj4 做一个完整的加入:
merge(df1,df2,by=c('numb','rand'),all.x=TRUE,all.y=TRUE) -
correcting: outer join,语法可以简化:
merge(df1,df2,by=c('numb','rand'),all=TRUE)
标签: r dataframe merge append rbind