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

R中将长表转为宽表并提取每个pt_id对应最早及最晚日期的实现方法

R语言实现按用户ID分组统计最早/最晚日期的方案

前置说明

你的Date字段当前为字符串格式,必须先转为日期格式才能正确比较时间先后,直接对字符串排序会出现逻辑错误。以下提供两种你已加载包对应的实现方案:


方案1:dplyr(tidyverse生态,代码可读性高)

# 你已同时加载plyr和dplyr,两者函数存在冲突,建议明确指定dplyr调用
library(dplyr)
library(lubridate) # tidyverse默认包含该日期处理包

result <- 你的原始数据集名 %>%
  # 将日-月-年格式的字符串转为日期类型
  mutate(Date = dmy(Date)) %>%
  # 按pt_id分组
  group_by(pt_id) %>%
  # 统计每组最早、最晚日期,转为原格式字符串输出
  dplyr::summarise(
    Date_first = format(min(Date), "%d-%m-%Y"),
    Date_last = format(max(Date), "%d-%m-%Y")
  ) %>%
  ungroup()

方案2:data.table(适合大数据量,运算速度更快)

library(data.table)
# 将原始数据集转为data.table对象
setDT(你的原始数据集名)

result <- 你的原始数据集名[, .(
  Date_first = format(min(as.IDate(Date, format = "%d-%m-%Y")), "%d-%m-%Y"),
  Date_last = format(max(as.IDate(Date, format = "%d-%m-%Y")), "%d-%m-%Y")
), by = pt_id]

# 若需要转回普通data.frame格式,执行下行代码
# result <- as.data.frame(result)

额外说明

  • 如果你需要保留日期类型字段而非字符串输出,删除format()包裹即可,直接写Date_first = min(Date)
  • 如果运行时提示函数冲突,所有涉及dplyr的函数都加上dplyr::前缀即可解决

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:54:01