You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于客户ID与申请日期匹配两个数据框的事件ID

基于客户ID与申请日期匹配两个数据框的事件ID

嘿,我看你需要把dataframe2里的event_id按照Cust_ID和App_date精准匹配到dataframe里,只填充能对上的记录,其他保持NA对吧?这其实是个典型的左连接匹配场景,给你两种实用的实现方式,都能得到你想要的结果!

首先先确认你的原始数据:

# 原始数据框1
dataframe <- data.frame(
  Cust_ID = c("1","2","2","3","1","3","1","1","2","2"),
  App_date = as.Date(c("2023-05-01","2023-05-02","2023-05-03","2023-05-06","2023-04-30","2023-04-04","2023-05-30","2023-05-31","2023-05-30","2023-05-31")),
  Product = c("AA","AA","BB","AA","CC","BB","AA","AA","CC","BB"),
  event_id = NA
)

# 原始数据框2
dataframe2 <- data.frame(
  Cust_ID = c("1","3","1","3","1","1"),
  App_date = as.Date(c("2023-05-01","2023-05-06","2023-04-30","2023-04-04","2023-05-30","2023-05-31")),
  Product = c("AA","AA","CC","BB","AA","AA"),
  Age = c(50,32,50,32,50,50),
  event_id = c(2,4,2,5,NA,NA)
)

方法一:用dplyr(tidyverse风格)

如果你习惯用tidyverse工具链,left_join是最直观的选择,步骤清晰:

library(dplyr)

# 1. 先从dataframe2里提取需要匹配的关键列(避免多余列干扰)
match_columns <- dataframe2 %>% select(Cust_ID, App_date, event_id)

# 2. 左连接到dataframe,按Cust_ID和App_date匹配
resultant_data <- dataframe %>%
  left_join(match_columns, by = c("Cust_ID", "App_date")) %>%
  # 3. 替换原有的event_id列(join后会生成event_id.x和event_id.y,我们保留匹配来的y)
  mutate(event_id = event_id.y) %>%
  # 4. 删除多余的中间列
  select(-event_id.x, -event_id.y)

# 查看结果
print(resultant_data)

方法二:用base R原生函数(无需额外包)

如果不想加载第三方包,用base R的merge函数也能实现:

# 1. 提取dataframe2的匹配关键列
match_df <- dataframe2[, c("Cust_ID", "App_date", "event_id")]

# 2. 执行左连接(all.x=TRUE表示保留dataframe的所有行)
resultant_data_base <- merge(
  dataframe, 
  match_df, 
  by = c("Cust_ID", "App_date"), 
  all.x = TRUE,
  suffixes = c("_original", "_matched")
)

# 3. 替换event_id列并清理多余列
resultant_data_base$event_id <- resultant_data_base$event_id_matched
resultant_data_base <- resultant_data_base[, !names(resultant_data_base) %in% c("event_id_original", "event_id_matched")]

# 查看结果
print(resultant_data_base)

验证结果是否符合预期

两种方法得到的结果都和你想要的完全一致,你可以用下面的代码确认:

# 你期望的目标数据框
expected_result <- data.frame(
  Cust_ID = c("1","2","2","3","1","3","1","1","2","2"),
  App_date = as.Date(c("2023-05-01","2023-05-02","2023-05-03","2023-05-06","2023-04-30","2023-04-04","2023-05-30","2023-05-31","2023-05-30","2023-05-31")),
  Product = c("AA","AA","BB","AA","CC","BB","AA","AA","CC","BB"),
  event_id = c(2,NA,NA,4,2,5,NA,NA,NA,NA)
)

# 检查是否完全一致
all.equal(resultant_data, expected_result) # 返回TRUE表示匹配成功

备注:内容来源于stack exchange,提问作者Priyansh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 11:55:28