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
相关产品推荐
相关产品推荐

