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

如何在R语言中筛选数据框分组的start_day最小值与end_day最大值

高效实现按ID聚合日期范围的方法

针对你的需求——按唯一id分组,取start_day的最小值(忽略NA)和end_day的最大值(忽略NA),以下是几种比循环更简洁高效的实现方式:

1. Base R 原生实现(无需额外包)

用tapply或aggregate完成分组聚合,适合不想加载第三方包的场景:

# 方式1:用tapply分字段处理
result_base <- data.frame(
  id = unique(df$id),
  start_day = tapply(df$start_day, df$id, function(x) min(x, na.rm = TRUE)),
  end_day = tapply(df$end_day, df$id, function(x) max(x, na.rm = TRUE))
)
# 修正全NA组返回的Inf/-Inf为NA
result_base$start_day[is.infinite(result_base$start_day)] <- NA
result_base$end_day[is.infinite(result_base$end_day)] <- NA

# 方式2:用aggregate一次性处理
result_base2 <- aggregate(cbind(start_day, end_day) ~ id, data = df, 
                          FUN = function(x) {
                            val <- if(all(is.na(x))) NA else if(deparse(substitute(x)) == "start_day") min(x, na.rm = TRUE) else max(x, na.rm = TRUE)
                            val
                          })

2. dplyr(tidyverse 生态,可读性强)

借助tidyverse系列的dplyr包,语法更直观,适合构建数据处理流水线:

library(dplyr)

result_dplyr <- df %>%
  group_by(id) %>%
  summarise(
    start_day = min(start_day, na.rm = TRUE),
    end_day = max(end_day, na.rm = TRUE),
    .groups = "drop"  # 取消分组状态
  ) %>%
  # 处理全NA组的异常值
  mutate(
    start_day = case_when(is.infinite(start_day) ~ NA, TRUE ~ start_day),
    end_day = case_when(is.infinite(end_day) ~ NA, TRUE ~ end_day)
  )

3. data.table(高性能,适合大数据场景)

如果你的数据量很大,data.table的运算速度远优于前两者,语法也极为简洁:

library(data.table)

# 转换为data.table对象
setDT(df)
result_dt <- df[, .(
  start_day = min(start_day, na.rm = TRUE),
  end_day = max(end_day, na.rm = TRUE)
), by = id]

# 修正全NA组的异常值
result_dt[is.infinite(start_day), start_day := NA]
result_dt[is.infinite(end_day), end_day := NA]

这三种方法都避免了循环的低效性,其中:

  • Base R无需依赖第三方包,适合轻量场景;
  • dplyr语法清晰,便于维护复杂的数据处理流程;
  • data.table在百万级以上数据量时优势明显。

内容的提问来源于stack exchange,提问作者Joe the Second

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:09:14