基于两个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
相关产品推荐
相关产品推荐

