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

如何在R中进一步筛选满足特定年龄测量条件的纵向BMI数据集

解决方案

可以用dplyr的分组+筛选结合between函数实现需求,全程用tidyverse语法更简洁统一,完整代码如下:

library(tidyverse)

# 加载数据并完成所有筛选步骤
dat_final <- read.csv("https://raw.githubusercontent.com/aelhak/NCRM2023/main/bmi_long.csv") %>% 
  select(id, age, bmi) %>% 
  # 初步筛选年龄在2周至10岁区间的观测
  filter(age > 0.038 & age < 10.1) %>%
  # 按个体分组
  group_by(id) %>%
  # 同时满足三个筛选条件:至少3次测量、有2岁前观测、有5-7岁区间观测
  filter(
    n() >= 3,
    any(age < 2),
    any(between(age, 5, 7))
  ) %>%
  # 取消分组,恢复普通数据框格式
  ungroup()

关键部分解释

  • group_by(id):把数据按个体ID分组,后续所有判断都针对每个ID的全部观测
  • n() >= 3:直接用n()获取每组的观测数量,替代你之前用rle的写法,更直观
  • any(age < 2):检查该ID是否存在至少一次年龄小于2岁的BMI观测
  • between(age, 5, 7):这就是你想用到的函数,用法是between(x, 左边界, 右边界),判断x是否落在包含边界的区间内;搭配any()就能确认该ID是否有至少一次观测在5-7岁之间

如果想保留你原来分步处理的逻辑,也可以把筛选拆成两步:

library(tidyverse)

# 加载数据并初步筛选年龄
dat <- read.csv("https://raw.githubusercontent.com/aelhak/NCRM2023/main/bmi_long.csv") %>% 
  select(id, age, bmi) %>% 
  filter(age > 0.038 & age < 10.1)

# 筛选至少3次测量的个体
dat <- dat %>%
  group_by(id) %>%
  filter(n() >= 3) %>%
  ungroup()

# 进一步筛选满足年龄条件的个体
dat_final <- dat %>%
  group_by(id) %>%
  filter(
    any(age < 2),
    any(between(age, 5, 7))
  ) %>%
  ungroup()

内容的提问来源于stack exchange,提问作者aelhak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:15:03