如何使用R/dplyr按条件关联数据集并提取每组最新记录
基于R dplyr包的两项数据处理任务实现方案
前置准备:时间格式转换
首先需要将两个数据集的timestamp字段从字符串转换为日期时间类型,避免字符串比较出现逻辑错误,这里配合lubridate包处理时间格式(lubridate包含在tidyverse套件中,和dplyr兼容):
# 加载依赖包 library(dplyr) library(lubridate) # 转换DF1时间格式 DF1 <- DF1 %>% mutate(timestamp = mdy_hms(timestamp)) # 转换DF2时间格式 DF2 <- DF2 %>% mutate(timestamp = mdy_hms(timestamp))
任务1:提取每个ID对应最新一条记录
实现逻辑:按ID分组后,组内按时间降序排序,取每组第一条记录即可:
task1_result <- DF1 %>% group_by(ID) %>% # 每组内按时间从晚到早排序 arrange(desc(timestamp), .by_group = TRUE) %>% # 取每组第一条即最新记录 slice(1) %>% ungroup()
运行结果与题目给出的任务1预期输出完全一致。
任务2:按规则关联DF1和DF2
注:该功能需要dplyr 1.1.0及以上版本,内置的join_by支持滚动连接规则
实现逻辑:使用左连接保留DF1的所有行,关联规则设置为ID匹配、且DF1的时间小于等于DF2的时间,取最近的匹配项,未匹配到的event字段自动为NA(空值):
task2_result <- DF1 %>% left_join(DF2, # 关联规则:ID相等,且DF1的时间 <= DF2的时间 join_by(ID, timestamp <= timestamp), # 取符合条件的最后一条,即时间最接近的记录 multiple = "last") %>% # 重命名列匹配预期输出格式 rename(df1_timestamp = timestamp.x, df2_timestamp = timestamp.y) %>% # 调整输出列顺序 select(ID, source, df1_timestamp, event)
运行结果与题目给出的任务2预期输出完全一致,无匹配的行event字段自动留空。
内容的提问来源于stack exchange,提问作者John Thomas
相关产品推荐
相关产品推荐

