在R中匹配相同品牌并查找重叠日期的实现方法
筛选同品牌且时间段重叠的R数据框行
步骤说明
首先需要将字符格式的日期转换为Date类型,才能正确比较时间段;之后按品牌分组,检查每组内的记录是否存在时间段重叠的情况。
方法一:使用dplyr + lubridate(简洁直观)
lubridate包的interval和int_overlaps函数可快速判断时间段是否重叠,结合dplyr的分组操作更高效:
library(dplyr) library(lubridate) # 转换日期列为Date类型,并创建时间区间 data_recalls <- data_recalls %>% mutate( Before_Date_Recall = as.Date(Before_Date_Recall), After_Date_Recall = as.Date(After_Date_Recall), recall_interval = interval(Before_Date_Recall, After_Date_Recall) ) # 筛选同品牌且存在重叠时间段的行 result <- data_recalls %>% group_by(Attributed_Brand) %>% mutate( # 检查当前行是否与组内其他行的时间段重叠 has_overlap = any(int_overlaps(recall_interval, recall_interval[-.current_row])), .current_row = row_number() ) %>% filter(has_overlap) %>% select(-recall_interval, -.current_row) %>% ungroup() print(result)
方法二:基础R实现(无需额外包)
如果不想加载第三方包,可通过基础R的日期比较逻辑判断重叠:
时间段重叠的核心条件是:A的开始日期 ≤ B的结束日期,且A的结束日期 ≥ B的开始日期(同时排除自身与自身比较的情况)。
# 转换日期格式 data_recalls$Before_Date_Recall <- as.Date(data_recalls$Before_Date_Recall) data_recalls$After_Date_Recall <- as.Date(data_recalls$After_Date_Recall) # 按品牌分组处理每个子集 result_list <- lapply(split(data_recalls, data_recalls$Attributed_Brand), function(df) { row_count <- nrow(df) # 生成重叠判断矩阵 overlap_matrix <- outer(1:row_count, 1:row_count, function(i, j) { i != j & df$Before_Date_Recall[i] <= df$After_Date_Recall[j] & df$After_Date_Recall[i] >= df$Before_Date_Recall[j] }) # 保留至少与一行重叠的记录 df[rowSums(overlap_matrix) > 0, ] }) # 合并分组结果 result <- do.call(rbind, result_list) rownames(result) <- NULL print(result)
结果说明
两种方法都会筛选出Nike的两条记录(它们的时间段2018-09-22至2018-10-21与2018-10-19至2018-10-31存在重叠),而Adidas和Puma的记录因组内无其他重叠项会被排除。
内容的提问来源于stack exchange,提问作者Niklas Schröder
相关产品推荐
相关产品推荐

