在R中筛选检测结果跨度≥3年个体的DataFrame处理方法
血液检测数据筛选问题
血液检测数据集
id result date A1 80 01/01/2006 A1 70 02/10/2006 A1 61 01/01/2007 A1 30 01/01/2008 A1 28 03/06/2008 B2 40 01/01/2006 B2 30 01/10/2006 B2 25 01/01/2015 B2 10 01/01/2020 G3 28 01/01/2009 G3 27 01/01/2014 G3 25 01/01/2013 G3 24 01/01/2011 G3 22 01/01/2019 U7 20 01/01/2005 U7 19 01/01/2006 U7 18 01/04/2006 U7 18 01/08/2006
需求
仅保留血液检测结果时间跨度至少为3年的个体。
已有代码(日期转年份)
df %>% # 为每个ID创建年份列 mutate(date = dmy(date)) %>% mutate(year = year(date)) %>% # 按ID分组 group_by(ID, year) %>% # 计算最大差值 summarise(max_diff = max(year) - min(year))
问题
如何继续使用管道操作移除max_diff <3的个体?
期望输出
id result date B2 40 2006 B2 30 2006 B2 25 2015 B2 10 2020 G3 28 2009 G3 27 2014 G3 25 2013 G3 24 2011 G3 22 2019
解决方案
你之前的代码存在分组错误:同时按ID和year分组会导致每个分组内的年份相同,计算出的max_diff始终为0,无法正确统计个体的时间跨度。修正后的管道操作如下:
方法一:直接在原数据中计算并筛选
library(dplyr) library(lubridate) df %>% # 转换日期格式并提取年份 mutate(date = dmy(date), year = year(date)) %>% # 仅按ID分组,计算该个体的检测时间跨度 group_by(id) %>% mutate(time_span = max(year) - min(year)) %>% # 筛选时间跨度≥3年的记录 filter(time_span >= 3) %>% # 可选:移除临时计算的time_span列 select(-time_span)
方法二:先筛选有效ID再过滤数据
如果需要保留中间的有效ID列表,也可以用这种方式:
# 先获取符合时间跨度要求的ID列表 valid_ids <- df %>% mutate(date = dmy(date), year = year(date)) %>% group_by(id) %>% summarise(time_span = max(year) - min(year)) %>% filter(time_span >= 3) %>% pull(id) # 用有效ID过滤原数据 df %>% mutate(date = dmy(date), year = year(date)) %>% filter(id %in% valid_ids)
两种方法都能得到你想要的输出结果,筛选出B2和G3这两个时间跨度满足要求的个体数据。
后续计划
将筛选后的个体数据用于时间预测相关分析。
内容的提问来源于stack exchange,提问作者tacrolimus
相关产品推荐
相关产品推荐

