【问题标题】:merge dataframes based on common columns but keeping all rows from x [duplicate]基于公共列合并数据框,但保留 x 中的所有行 [重复]
【发布时间】:2017-04-19 15:14:17
【问题描述】:

我需要合并两个数据框 xy,它们有大约 50 列共同和一些独特的列,我需要保留 中的所有行x.

如果我运行它会起作用:

 NewDataframe <- merge(x, y, by=c("ColumnA", "ColumnB", "ColumnC"),all.x=TRUE)

问题是公共列有50多个,我宁愿避免输入所有公共列的名称。

我试过了:

 NewDataframe <- merge(x, y, all.x=TRUE)

但是出现如下错误:

 Error in merge.data.table(x, y, all.x = TRUE) :
 Elements listed in `by` must be valid column names in x and y

有没有什么方法可以将by 与公共列一起使用而无需键入所有这些列,但保留 x 中的所有行?

谢谢。

【问题讨论】:

  • 你试过dplyr::left_join吗?那应该可以在一个命令中完成您想要的所有操作。

标签: r dataframe merge


【解决方案1】:

我认为您有数据表而不是简单的数据框,并且两者之间的合并工作方式略有不同。您可以尝试通过使用 NewDataframe &lt;- merge.data.frame(x, y, all.x=TRUE) 强制它使用数据框方法,默认情况下它应该合并所有共享列名。

【讨论】:

    【解决方案2】:

    您希望基于所有常用列进行合并。因此,首先您需要找出两个数据帧之间共有哪些列名。

    common_col_names <- intersect(names(x), names(y))
    

    然后你在合并函数中使用这个字符向量作为你的by参数。

    merge(x, y, by=common_col_names, all.x=TRUE)
    

    编辑:在阅读了@Andrew Gustar 的answer 之后,我仔细检查了合并功能的文档,这正是默认的by 参数:

    ## S3 method for class 'data.frame'
    merge(x, y, by = intersect(names(x), names(y)), # <-- Look here
          by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
          sort = TRUE, suffixes = c(".x",".y"),
          incomparables = NULL, ...)
    

    【讨论】:

    • 使用 all.y=T,我正确地获得了数据框 Y 中的值,但它还将所有列添加到最终合并的数据框中,而不仅仅是公共列。所有列都通过了。
    【解决方案3】:

    dplyr 中的 left_join 函数应该可以为您提供您想要的。

    首先创建一些虚拟数据...

    shared <- tibble(a=rnorm(327), b=rnorm(327),c=rnorm(327),d=rnorm(327),e=rnorm(327),f=rnorm(327),g=rnorm(327))
    x <- cbind(shared, tibble(v =rnorm(327),w=rnorm(327),x=rnorm(327),y=rnorm(327),z=rnorm(327)))
    y <- cbind(shared, tibble(h =rnorm(327),i=rnorm(327),j=rnorm(327),k=rnorm(327),l=rnorm(327)))
    rm(shared)
    

    然后只需运行连接...

    dplyr::left_join(x,y)
    # Joining, by = c("a", "b", "c", "d", "e", "f", "g")
    

    如您所见,该函数计算出哪些列在两者之间共享,并自动在连接中使用它们。

    【讨论】:

      猜你喜欢
      • 2019-02-12
      • 1970-01-01
      • 2021-03-11
      • 2016-01-05
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 2023-04-04
      • 2021-10-10
      相关资源
      最近更新 更多