【问题标题】:merge in R results in more rows than one of the data frames在 R 中合并导致比其中一个数据框更多的行
【发布时间】:2015-08-05 07:14:41
【问题描述】:

我有两个数据框,第一个包含 9994 行,第二个包含 60431 行。我想合并两个数据框,使合并的数据框包含两个数据框的组合列,但仅包含 9994 行。

但是,合并后我得到了超过 9994 行。如何确保不会发生这种情况?

df1 = readRDS('data1.RDS')
nrow(df1)
# [1] 9994

df2 = readRDS('data2.RDS')
nrow(df2)
# [1] 60431

df = merge(df1,df2,by=c("col1","col2"))
nrow(df)
# [1] 10057

df = merge(df1,df2,by=c("col1","col2"),all.x=TRUE)
nrow(df)
# [1] 10057
nrow(na.omit(df))
# [1] 10057

编辑:按照 akrun 的评论。 是的,第二个数据框中有重复项

nrow(unique(df2[,c("col1","col2")]))
# [1] 60263
nrow(df2)
# [1] 60431

如果同一 {col1,col2} 组合有多个,我如何才能从数据框中只取一行。当我合并时,我希望只有 9994 行。

【问题讨论】:

  • 您能否检查每个数据集中是否存在“col1”和“col2”的重复项?如果是这种情况,您可以创建一个序列索引,在每个数据集中按“col1”和“col2”分组,并按“col1”、“col2”和“indx”进行合并。另一种选择是使用match。但是,没有一个小例子,很难测试
  • @akrun,谢谢 akrun。我在上面做了一个编辑。请参见。我怎样才能只为 col1,col2 组合取一行,以便在合并时得到与第一个数据框中一样多的行?
  • 您可能需要创建一个序列索引,正如我之前评论的那样。没有示例数据,很难测试。请展示一些可重现的示例
  • 你需要创建一个序列来索引它,正如 akrun 提到的那样。
  • 我认为indx 不会解决问题。我认为有必要决定如何处理df2 中的重复案例,即取第一个、最后一个、平均等,以便只有df1df2 中的额外列。跨度>

标签: r merge dataframe rstudio


【解决方案1】:

这应该可行,请务必先对 df2 进行排序,以便选择正确的行。

df = merge(
  df1,
  df2[!duplicated(df2[, c("col1","col2")], ],
  by=c("col1","col2"),
  all.x=TRUE
)

这里发生了什么:我通过我们要合并的列合并两个数据框,但我首先从第二个 data.frame df2 中仅选择 col1col2 的任意组合的第一个匹配项.

duplicated 检查是否在使用data.frame 调用时重复行。我从df2 中选择col1col2,所以duplicated 为具有相同col1col2 的行返回TRUE,但在其他列中存在差异。然后我只选择不重复的行。

(仔细阅读[-表达式,从内到外检查函数调用,得到中间结果)

编辑:添加了 cmets 中建议的解释

【讨论】:

  • 能否也请您添加代码解释?
  • 当我将解决方案代码复制到 R Studio 时,我收到了四个意外/不匹配的左括号和右括号投诉,即使代码在这方面看起来是正确的。有人知道为什么吗?
猜你喜欢
  • 2017-01-14
  • 2014-07-31
  • 1970-01-01
  • 2021-09-10
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
相关资源
最近更新 更多