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

在R语言中按ID筛选特定周数区间内的最优测量值

按周数区间筛选长格式数据集,保留最接近理想周数的记录

需求说明

现有一个长格式数据集,每个参与者应包含9项测量值,但实际每条ID的记录数都多于9条。需要根据Weeks变量的指定区间筛选记录,每个区间对应一个理想周数:

  1. 第1项:Weeks < 12,理想周数10
  2. 第2项:12 ≤ Weeks < 25,理想周数16
  3. 第3项:25 ≤ Weeks < 28,理想周数25
  4. 第4项:28 ≤ Weeks < 31,理想周数28
  5. 第5项:31 ≤ Weeks < 34,理想周数31
  6. 第6项:34 ≤ Weeks < 36,理想周数34
  7. 第7项:36 ≤ Weeks < 38,理想周数36
  8. 第8项:38 ≤ Weeks < 40,理想周数38
  9. 第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)

解决方案

通过以下步骤实现筛选逻辑:

  1. 定义区间规则与对应理想周数的映射
  2. 为每条记录匹配所属区间的理想周数
  3. 按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:35:10