如何按ID分组生成含首次/末次年份的DataFrame?R语言求助
按ID汇总个体首次/末次记录年份的解决方案
问题背景
现有包含多个个体多年记录的DataFrame,需要生成汇总表,展示每个ID对应的首次记录年份和末次记录年份。示例数据如下:
df1<-data.frame(ID=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5), year=c("2021","2021","2022","2023","2021","2021","2022","2023","2021","2021","2022","2023", "2021","2021","2022","2023","2021","2021","2022","2023"), x=c(2,4,5,9,9,7,5,3,2,4,5,9,9,7,5,3,6,8,3,4), y=c(2,4,5,9,9,7,5,3,2,4,5,9,9,7,5,3,6,8,3,4))
原尝试代码仅返回一行结果,无法按ID分组展示:
IDs<-df1 %>% group_by(ID) %>% summarise(strYear=(min(year))
问题原因与解决代码
错误原因
原代码存在语法错误:summarise函数内的表达式缺少闭合右括号,导致分组逻辑未正确执行,返回异常结果。
修正后的代码
以下代码可按ID分组,同时计算首次年份和末次年份:
library(dplyr) # 方案1:直接对字符型year计算(适用于格式规范的年份字符串) ID_year_summary <- df1 %>% group_by(ID) %>% summarise( first_year = min(year), last_year = max(year), .groups = "drop" # 取消分组,返回普通DataFrame ) # 方案2:将year转为数值型后计算(更严谨,避免字符串排序异常) ID_year_summary <- df1 %>% mutate(year = as.numeric(year)) %>% group_by(ID) %>% summarise( first_year = min(year), last_year = max(year), .groups = "drop" )
结果说明
运行后将得到每行对应一个唯一ID的汇总表,包含first_year(首次记录年份)和last_year(末次记录年份)字段。
内容的提问来源于stack exchange,提问作者Margaret Hughes
相关产品推荐
相关产品推荐

