【问题标题】:How to retain the common columns from both the tables after merge() in R?如何在R中的merge()之后保留两个表中的公共列?
【发布时间】:2018-07-06 10:49:35
【问题描述】:

我一直在寻找一种方法来保留 R 合并中的两个公共列,这通常会从数据中删除一个公共列。任何帮助将不胜感激。

例如

名为demographics 的data.frame 有“EmpID”、“Sal”、“Dob”、“City” 并且transaction data.frame 有“ID”、“Loan1”、“Bonus”

如果做内连接,

res <- merge(demographics, transaction, by.x = "EmpID", by.y = "ID")

结果表 res 将具有以下列

“EmpID”“Sal”“Dob”“City”“Loan1”“Bonus”

我也想包含“ID”列。

“EmpID”“Sal”“Dob”“City”“ID”“Loan1”“Bonus”

在 R 中怎么可能?

【问题讨论】:

    标签: r join merge


    【解决方案1】:

    一种选择是使用sqldf 库,只需编写一个保留所有列的查询:

    library(sqldf)
    sql <- "select d.*, t.* from demographics d inner join transaction t "
    sql <- paste0(sql, "on d.EmpID = t.ID")
    
    res <- sqldf(sql)
    

    【讨论】:

    • 是的,同意sqldf 可以是一个选项,但我希望使用 Base/dplyr/data.table 语法来实现它。
    【解决方案2】:

    可能有点矫枉过正(需要附加一个包并且会产生重要的性能开销),但fuzzyjoin 函数始终保持双方:

    library(fuzzyjoin)
    fuzzy_inner_join(iris1,iris2,by=c(id = "IRISid"),`==`)
    #   Sepal.Length Sepal.Width id Petal.Length Petal.Width IRISid
    # 1          5.1         3.5  1          1.4         0.2      1
    # 2          4.9         3.0  2          1.4         0.2      2
    # 3          4.7         3.2  3          1.3         0.2      3
    

    数据

    iris1 <- data.frame(head(iris[1:2],3),id=1:3)
    #   Sepal.Length Sepal.Width id
    # 1          5.1         3.5  1
    # 2          4.9         3.0  2
    # 3          4.7         3.2  3
    
    iris2 <- data.frame(head(iris[3:4],3),IRISid=1:3)
    #   Petal.Length Petal.Width IRISid
    # 1          1.4         0.2      1
    # 2          1.4         0.2      2
    # 3          1.3         0.2      3
    

    【讨论】:

      【解决方案3】:

      我认为这个额外的列会是多余的,但你可以在合并后执行res$ID &lt;- res$EmpID 来复制列,对吧?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-25
        • 1970-01-01
        • 2021-10-07
        • 2017-01-14
        • 2020-08-19
        • 1970-01-01
        • 2015-04-09
        • 1970-01-01
        相关资源
        最近更新 更多