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

基于两个DataFrame日期差的复杂操作:为df1新增就诊标识列

解决方法

首先需要将两个数据框中的日期列转换为日期格式(原始数据为字符型,无法直接进行日期运算),之后通过匹配用户ID,检查每个诊断记录对应的用户是否在诊断日期前30天内有就诊记录。

方法一:使用dplyr包(直观易读)

# 加载dplyr包
library(dplyr)

# 转换日期格式为可运算的Date类型
df1 <- df1 %>% mutate(Diagnosis_date = as.Date(Diagnosis_date))
df2 <- df2 %>% mutate(Visit_date = as.Date(Visit_date))

# 预先整理每个用户的就诊日期列表,提升后续判断效率
user_visit_list <- df2 %>%
  group_by(User_ID) %>%
  summarise(visit_dates = list(Visit_date))

# 为df1添加新列,判断是否存在诊断前30天内的就诊记录
df1 <- df1 %>%
  left_join(user_visit_list, by = "User_ID") %>%
  rowwise() %>%
  mutate(has_recent_visit = any(visit_dates >= (Diagnosis_date - 30) & visit_dates < Diagnosis_date)) %>%
  select(-visit_dates) %>%  # 移除临时辅助列
  ungroup()

方法二:使用data.table包(高效处理大数据)

如果数据集规模较大,data.table的方法会更高效:

# 加载data.table包
library(data.table)

# 转换为data.table格式并处理日期列
setDT(df1)[, Diagnosis_date := as.Date(Diagnosis_date)]
setDT(df2)[, Visit_date := as.Date(Visit_date)]

# 添加判断列
df1[, has_recent_visit := df2[.SD, on = .(User_ID), 
                              any(Visit_date >= (Diagnosis_date - 30) & Visit_date < Diagnosis_date), 
                              by = .EACHI]$V1]

结果扩展(可选)

默认生成的has_recent_visit是逻辑值(TRUE/FALSE),如果需要转换为其他格式:

# 转换为0/1数值
df1 <- df1 %>% mutate(has_recent_visit = as.integer(has_recent_visit))

# 或者转换为中文标识
df1 <- df1 %>% mutate(has_recent_visit = ifelse(has_recent_visit, "是", "否"))

内容的提问来源于stack exchange,提问作者Hazem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:27:20