在R语言中按ID筛选特定周数区间内的最优测量值
按周数区间筛选长格式数据集,保留最接近理想周数的记录
需求说明
现有一个长格式数据集,每个参与者应包含9项测量值,但实际每条ID的记录数都多于9条。需要根据Weeks变量的指定区间筛选记录,每个区间对应一个理想周数:
- 第1项:
Weeks < 12,理想周数10 - 第2项:
12 ≤ Weeks < 25,理想周数16 - 第3项:
25 ≤ Weeks < 28,理想周数25 - 第4项:
28 ≤ Weeks < 31,理想周数28 - 第5项:
31 ≤ Weeks < 34,理想周数31 - 第6项:
34 ≤ Weeks < 36,理想周数34 - 第7项:
36 ≤ Weeks < 38,理想周数36 - 第8项:
38 ≤ Weeks < 40,理想周数38 - 第9项:
Weeks ≥ 40,理想周数40
若同一参与者在某个区间内有多条记录,仅保留与该区间理想周数最接近的那条,其余记录删除。
示例数据
ID <- c(1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2) Weeks <- c(11,16,25,28,31,34,35,36,38,40, 6,12,13,26,29,31,32,33,34,36,38,40,41) Measurement <- c(120,160,170,200,120,40,89,70,63,44, 90,92,93,94,95,96,97,100,100, 120, 110, 100, 130) df1 <- data.frame(ID, Weeks, Measurement)
解决方案
通过以下步骤实现筛选逻辑:
- 定义区间规则与对应理想周数的映射
- 为每条记录匹配所属区间的理想周数
- 按
ID和区间分组,保留与理想周数差值最小的记录
R代码实现
# 定义区间规则:键为理想周数,值为区间判断条件 interval_rules <- list( "10" = ~Weeks < 12, "16" = ~Weeks >=12 & Weeks <25, "25" = ~Weeks >=25 & Weeks <28, "28" = ~Weeks >=28 & Weeks <31, "31" = ~Weeks >=31 & Weeks <34, "34" = ~Weeks >=34 & Weeks <36, "36" = ~Weeks >=36 & Weeks <38, "38" = ~Weeks >=38 & Weeks <40, "40" = ~Weeks >=40 ) # 为每条记录匹配对应的理想周数 df1$ideal_week <- NA for (iw in names(interval_rules)) { df1$ideal_week[eval(interval_rules[[iw]], df1)] <- as.numeric(iw) } # 分组筛选:保留每个ID-区间组内与理想周数差值最小的记录 library(dplyr) result_df <- df1 %>% group_by(ID, ideal_week) %>% mutate(diff = abs(Weeks - ideal_week)) %>% filter(diff == min(diff)) %>% select(-diff, -ideal_week) %>% ungroup() # 查看最终结果 result_df
结果验证
运行代码后,得到的数据集会移除原数据的第7、12、17、18、23行,与预期完全一致。
内容的提问来源于stack exchange,提问作者19056530
相关产品推荐
相关产品推荐

