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

data.frame按ID分组排序后删除组内最小值前置所有行的实现方法

R语言data.frame按分组截断实现方案

以下提供两种常用实现方式:

方法1:tidyverse生态方案(推荐,可读性高)

依赖dplyr和lubridate包,适合日常数据分析场景:

# 加载依赖包
library(dplyr)
library(lubridate)

DF2 <- DF1 %>%
  # 转换日期格式,避免字符串排序错误(输入为月/日/年格式,对应mdy函数)
  mutate(Date = mdy(Date)) %>%
  # 按ID分组
  group_by(ID) %>%
  # 组内按日期升序排列
  arrange(Date, .by_group = TRUE) %>%
  # 保留第一个最小值出现位置及之后的所有行
  filter(row_number() >= which.min(Value)) %>%
  # 解除分组
  ungroup()

方法2:Base R方案(无需安装第三方包)

适合轻量化运行场景:

# 转换日期格式
DF1$Date <- as.Date(DF1$Date, format = "%m/%d/%Y")
# 按ID、日期升序排序
DF1_sorted <- DF1[order(DF1$ID, DF1$Date), ]
# 按ID分组截断后合并
DF2 <- do.call(rbind, lapply(split(DF1_sorted, DF1_sorted$ID), function(group_df) {
  min_row <- which.min(group_df$Value)
  group_df[min_row:nrow(group_df), ]
}))
# 重置行号
rownames(DF2) <- NULL

注意事项

  • 若同一个ID下存在多个相同的最小值,两种方案均默认取时间最早的最小值行作为截断点,符合需求常规逻辑
  • 两种方案均天然支持多ID批量处理,无需额外调整逻辑
  • 若需要保留原日期字符串格式,可在处理完成后通过format(Date, "%m/%d/%Y")转换回原始格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:15:04