R语言中为每个ID设置独立起始日期并计算自称重统计量的问询
问题需求
为每个ID设置独立起始日期,计算两个核心指标:
- 年度内个体称重次数≥6次的周数(格式:达标周数/总周数)
- 年度内个体每周平均称重天数(格式:平均天数/7)
数据集结构示例:
| ID | Weight | Timestamp | Day | Week |
|---|---|---|---|---|
| 1 | 200 | 2021/05/05 | 18752 | 202118 |
| 1 | 205 | 2021/05/06 | 18753 | 202118 |
| 1 | 203 | 2021/05/10 | 18757 | 202119 |
| 2 | 170 | 2021/05/05 | 18752 | 202118 |
| 2 | 177 | 2021/05/06 | 18753 | 202118 |
预期输出:
| ID | Number of weeks/ year with 6+ | Avg number of days/week over 1 year |
|---|---|---|
| 1 | example: 35/52 | example: 4.3/7 |
| 2 | example: 23/52 | example: 3.5/7 |
R实现方案
使用dplyr和lubridate包高效处理分组计算,无需循环:
# 加载依赖包 library(dplyr) library(lubridate) # 示例数据(替换为你的实际数据集) df <- data.frame( ID = c(1,1,1,2,2), Weight = c(200,205,203,170,177), Timestamp = c("2021/05/05","2021/05/06","2021/05/10","2021/05/05","2021/05/06"), Day = c(18752,18753,18757,18752,18753), Week = c(202118,202118,202119,202118,202118) ) # 1. 数据预处理:转换日期、确定个体起始日、筛选1年周期内的数据 processed_df <- df %>% mutate(Timestamp = ymd(Timestamp)) %>% group_by(ID) %>% mutate( start_date = min(Timestamp), # 以个体首次测量日为起始,可自定义替换 end_date = start_date + days(364), # 覆盖365天周期 in_year = Timestamp >= start_date & Timestamp <= end_date ) %>% filter(in_year) %>% ungroup() # 2. 按ID分组计算指标 result <- processed_df %>% group_by(ID, Week) %>% summarise( weekly_count = n(), daily_unique = n_distinct(Day), .groups = "drop_last" ) %>% summarise( `Number of weeks/ year with 6+` = paste(sum(weekly_count >= 6), n_distinct(Week), sep = "/"), `Avg number of days/week over 1 year` = paste(round(mean(daily_unique), 1), 7, sep = "/") ) %>% ungroup() # 输出结果 print(result)
关键说明
- 起始日期默认取每个ID的首次测量日,若需指定其他日期(如入组日),直接将
start_date = min(Timestamp)替换为对应列或固定日期即可 - 用
days(364)确保周期包含起始日在内共365天 - 先按周统计基础数据,再向上汇总年度指标,逻辑清晰且效率优于循环
内容的提问来源于stack exchange,提问作者Anas Alkanderi
相关产品推荐
相关产品推荐

