【问题标题】:How to rbind new rows from one data frame to an existing data frame in R [duplicate]如何将一个数据帧中的新行绑定到R中的现有数据帧[重复]
【发布时间】: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


【解决方案1】:

我们可以从data.table 使用rbindlist/unique。我们将数据集放在list 中,使用rbindlist(来自data.table)将list 中的数据集rbind 到单个data.table 并从data.table 获得unique 行和unique其中还有 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

【讨论】:

  • 不是我的投票(我不会在这里投票),但我认为它可能与this meta post 有关。在我看来,您的回答虽然是正确的,但只是放弃了一堆功能,而没有任何关于它如何工作/解决问题的解释。这使得它对未来的读者没有真正的用处,因为他们很难弄清楚什么是做什么的,所以它没有用在我看来(我也认为在其他人看来)。
  • 你要求解释,我只是给出了我的观点。我只是添加了精确度,因为我不能代表别人说话。
  • OP 对我来说太长了,我无法阅读,但这可能是相关的(因为相同的答案似乎很合适):stackoverflow.com/q/39398135(几乎可以肯定不是骗子,因为那里的 OP 想要包-具体答案。)
  • @Frank 这看起来像个骗子。我会标记它
猜你喜欢
  • 1970-01-01
  • 2021-04-28
  • 2020-09-26
  • 2021-09-04
  • 2021-03-26
  • 2019-08-16
  • 2013-12-05
  • 2021-07-25
  • 1970-01-01
相关资源
最近更新 更多