【问题标题】:How to merge two data frames based on unique ID's and changing/updating a column如何根据唯一 ID 合并两个数据框并更改/更新列
【发布时间】:2019-06-10 12:31:32
【问题描述】:

我刚刚获得了 2 个销售数据框;主数据框包含所有信息,而第二个数据框包含当月的最新销售额。

我需要根据客户的唯一 ID 将一个数据帧中的信息合并到另一个数据帧中。具体来说,我想根据新的df更新主数据框中的信息。

我曾尝试在 R 中使用合并功能,但在替换信息时出错。我已经在excel中完成了这个合并(但是因为我有很多信息,所以需要一段时间)。

数据框看起来有点像这样...

MainDF
UID       Status      Gender     SaleType
136273    inactive      M        Repair
182732    inactive      F        Product
298372    quit          F        Repair
283715    inactive      M        Product

NewDFtoAdd
UID          Gender     
136273         M
293827         F
283715         F
167643         M

如果它们出现在 NewDFtoAdd 中,我想获取主 df 中的现有 ID 并将其状态重写为“活动”。

MainDF
UID       Status      Gender     SaleType
136273    **active**        M        Repair
182732    inactive      F        Product
298372    quit          F        Repair
283715    **active**        F        Product

我真的很想用 R 编写代码;因此,当给出新数据时,我可以相应地更新,我的分析代码可以继续。

【问题讨论】:

    标签: r dataframe merge merging-data


    【解决方案1】:

    我们可以使用data.table 加入将“状态”替换为“活动”,方法是加入on 'UID'

    library(data.table)
    setDT(MainDF)[NewDFtoAdd, Status := "active", on = .(UID)]
    MainDF
    #      UID   Status Gender SaleType
    #1: 136273   active      M   Repair
    #2: 182732 inactive      F  Product
    #3: 298372     quit      F   Repair
    #4: 283715   active      M  Product
    

    或者使用base R

    i1 <- MainDF$UID %in% NewDFtoAdd$UID
    MainDF$UID[i1] <- "active"
    

    注意:这给出了预期的输出。

    数据

    MainDF <- structure(list(UID = c(136273L, 182732L, 298372L, 283715L), Status = c("inactive", 
    "inactive", "quit", "inactive"), Gender = c("M", "F", "F", "M"
    ), SaleType = c("Repair", "Product", "Repair", "Product")), class = "data.frame", row.names = c(NA, 
    -4L))
    
    NewDFtoAdd <- structure(list(UID = c(136273L, 293827L, 283715L, 167643L), Gender = c("M", 
    "F", "F", "M")), class = "data.frame", row.names = c(NA, -4L))
    

    【讨论】:

      【解决方案2】:

      如果你喜欢dplyr 并想走这条路,你可以这样做:

      library(dplyr)
      
      MainDF%>%
      mutate_at(vars(Status), 
              list(~case_when(
                UID %in% NewDFtoAdd$UID ~ "active",
                TRUE ~ Status
              )))
      
      #     UID   Status Gender SaleType
      #1 136273   active      M   Repair
      #2 182732 inactive      F  Product
      #3 298372     quit      F   Repair
      #4 283715   active      M  Product
      

      【讨论】:

        猜你喜欢
        • 2019-12-16
        • 2023-01-08
        • 2015-04-17
        • 1970-01-01
        • 1970-01-01
        • 2018-02-24
        • 1970-01-01
        • 2018-03-09
        • 2021-10-05
        相关资源
        最近更新 更多