如何在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
相关产品推荐
相关产品推荐

