【问题标题】:Merge two data frames by id and date按 id 和 date 合并两个数据框
【发布时间】:2020-08-02 19:57:14
【问题描述】:

我有两个数据框。 答:

id  date
1   2010-05-08
2   2012-08-08
3   2013-06-23

乙:

id  date1
1   2010-05-09
2   2012-08-08

我需要通过 id 以及表 2 中的日期 = 表 1 中的日期 +1 天来合并两个数据框。进一步标记合并为 TRUE 的行。

最终输出是 答:

id  date           date1      flag
1   2010-05-08    2010-05-09   1
2   2012-08-08       NA        NA
3   2013-06-23       NA        NA

生成数据的代码-

A <- data.frame(customer = c(1,2,3),
                application_date = c("2010-05-08", "2012-08-08", "2013-06-23"))
B <- data.frame(customer = c(1,2),
                application_date = c("2010-05-09", "2012-08-08"))

【问题讨论】:

标签: r dplyr data.table


【解决方案1】:

这个怎么样?

数据

A <- data.frame(customer = c(1,2,3),
                application_date = c("2010-05-08", "2012-08-08", "2013-06-23"))
B <- data.frame(customer = c(1,2),
                application_date = c("2010-05-09", "2012-08-08"))

DPLYR

library(dplyr)

    data <- left_join(A, B, by = "customer")
    data %>% 
      mutate(logic = if_else(as.Date(data$application_date.x) + 1 == as.Date(data$application_date.y), 1, 0)) %>% 
      rename("id" = "customer",
             "date" = "application_date.x",
             "date1" = "application_date.y",
             "flag" = "logic")

输出

 id       date          date1         flag
 1       2010-05-08     2010-05-09    1 
 2       2012-08-08     2012-08-08    0 
 3       2013-06-23     <NA>          NA

DATA.TABLE

library(data.table)

data_2 <- merge.data.table(A, B, by = "customer", all.x=TRUE)
data_2[, logic:= (ifelse(as.Date(data$application_date.x) + 1 == as.Date(data$application_date.y), 1, 0))]
setnames(data_2, old = c("customer", "application_date.x", "application_date.y", "logic"), 
                 new = c("id", "date", "date1", "flag"))

输出

 id       date          date1         flag
 1       2010-05-08     2010-05-09    1 
 2       2012-08-08     2012-08-08    0 
 3       2013-06-23     <NA>          NA

【讨论】:

  • 非常感谢埃里克。您也可以提供 data.table 代码吗?我是 R 新手,有人建议我使用 data.table。
  • 更新了我的答案以包含 data.table。
【解决方案2】:

如果您不介意通过引用直接更新 A,这里有一个更新连接选项:

library(data.table)
setDT(A)[, d := dateA + 1L]
setDT(B)
A[B, on=.(id, d=dateB), c("dateB", "flag") := .(dateB, 1L)]

数据:

A <- data.frame(id = c(1,2,3),
    dateA = as.Date(c("2010-05-08", "2012-08-08", "2013-06-23")))
B <- data.frame(id = c(1,2),
    dateB = as.Date(c("2010-05-09", "2012-08-08")))

【讨论】:

    【解决方案3】:

    使用data.table:

    data <- merge(A, B, by = "customer",all.x = TRUE)
    library(data.table)
    
    setDT(data)
    data[as.Date(application_date.x)+1==application_date.y,flag:=1]
    data[as.Date(application_date.x)+1!=application_date.y,flag:=0]
    data <- data[,.(id=customer, date=application_date.x,date1=application_date.y,flag)]
    data
    
    

    【讨论】:

    • 感谢 jnordeman。我需要通过 ID 加入,并且它满足条件,tableB 的申请日期 = 表 1 的申请日期 +1 天。
    猜你喜欢
    • 2018-09-20
    • 2020-05-06
    • 1970-01-01
    • 2013-11-09
    • 2020-12-10
    • 2018-04-08
    • 1970-01-01
    • 2021-12-18
    • 2017-03-20
    相关资源
    最近更新 更多