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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:32:37