【问题标题】:Merge function generates duplicates合并函数生成重复项
【发布时间】:2016-10-18 20:56:30
【问题描述】:

这个问题只是为了理解为什么会发生这种情况。

我正在合并两个数据库:

bot.rep.geo <- merge(x = bot.rep, y = geo.2016, by = "cod.geo", all.x = TRUE)

原始数据库有以下维度:bot.rep 有 1634451 个观测值,geo.2016 有 1393 个。

使用all.x = TRUE 合并后,新数据库出现1727681,而不是与bot.rep 相同的大小。

为什么会这样?

快速查看后,我意识到它创建了一些重复项,但我不明白原因以及我在使用 merge 函数时是否做错了什么。

【问题讨论】:

  • 通过选择all.x = TRUE,您相当于在SQL 中使用LEFT JOIN。这并不意味着来自bot.rep 的给定行只会出现一次。相反,它会在cod.geo 中的每个匹配出现一次,并且bot.rep 中的每一行即使不匹配任何内容也保证出现。
  • 向我们展示一些示例数据,这将一目了然。
  • 感谢@TimBiegeleisen 的澄清。有什么办法可以防止这种情况发生,还是只需要事后删除重复项?
  • @RafaelSierra 做一个unique(merge(x = bot.rep, y = geo.2016, by = "cod.geo", all.x = TRUE))...和之后做的一样...合并函数没有唯一的参数
  • 你们是对的。我没有意识到我有一个特定的变量,我正在创建一个与其他 3 个连接的特定变量。变量是 1 1 11,但有一种情况是 1 11 1 可能发生,而我之前没有注意到。谢谢大家的帮助!

标签: r database merge duplicates


【解决方案1】:

geo.2016 表中可能存在 cod.geo 值出现两次或更多次的行。

如果您的 bot.rep 数据中的 bot.rep 值为“X”,那么在 geo.2016 数据中有 2 行包含“X”,合并将复制 bot.rep 中的行并加入来自 geo.2016 的 2 行。

【讨论】:

  • 谢谢!我现在明白为什么会这样了。
【解决方案2】:

这是因为one-to-many relationship,x 在 y 中有多行匹配。

参见下面的示例,其中bot.rep cod.geo 的值 1geo.2016 数据集中有 2 个匹配项。因此,对于 1 个 ID,我们有 2 行。另外,请注意,由于 all.x = TRUE 参数,我们正在为不匹配的 id 创建 NA 行。

现在,您需要确定哪一行与 cod.geo1 重复。

#dummy data
bot.rep <- data.frame(cod.geo = 1:4)
geo.2016 <- data.frame(cod.geo = c(1,1,3,5,6), z = 1:5)

bot.rep.geo <- merge(x = bot.rep, y = geo.2016,
                     by = "cod.geo", all.x = TRUE)

#   cod.geo  z
# 1       1  1
# 2       1  2
# 3       2 NA
# 4       3  3
# 5       4 NA

您将找到有关不同类型merge functions here 的更多信息。

【讨论】:

  • @akrun 我不这么认为,因为它问的是发生这种情况的原因,而不是如何合并。如果您觉得这是一个骗子,请随时投票关闭、否决、标记等。
  • 我只是好奇,
猜你喜欢
  • 2014-09-22
  • 2017-11-10
  • 2016-04-13
  • 1970-01-01
  • 2019-02-05
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
相关资源
最近更新 更多