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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:57:01