如何用R的dplyr筛选同时具备指定多组timepoint值的ID记录
R实现筛选同时包含指定多个时间点的ID的方法
你之前用%in%或者|运算符得到错误结果的核心原因是:这两个运算符都是对单行数据做判断,只能筛选出Timepoint为1/6/12的行,没法校验同一个ID是否同时覆盖了三个要求的时间点,所以会把只有1个或2个符合时间点的ID也保留下来。
你可以用以下两种常用方法实现需求:
首先构造和你示例一致的测试数据集:
df <- data.frame( ID = c(1,1,1,2,3,3,3,3,4,4,4), Timepoint = c(1,6,12,1,1,6,12,18,1,6,12) )
方法1:基础R实现
核心思路是按ID分组,验证每个ID对应的所有时间点是否同时包含1、6、12三个值,筛选出符合要求的ID后再回表过滤:
# 筛选同时包含三个时间点的ID target_ids <- as.numeric(names(which(tapply(df$Timepoint, df$ID, function(x) all(c(1,6,12) %in% x))))) # 过滤得到对应ID的全量数据 result <- df[df$ID %in% target_ids, ] # 如需仅输出符合条件的唯一ID,直接打印target_ids即可
方法2:dplyr(tidyverse系列)实现
写法更直观,适合日常数据处理场景:
library(dplyr) # 过滤得到符合条件的ID的全量数据 result <- df %>% group_by(ID) %>% filter(all(c(1,6,12) %in% Timepoint)) %>% ungroup() # 如需仅提取符合条件的唯一ID unique_target_ids <- result %>% distinct(ID) %>% pull(ID)
两种方法得到的符合条件ID均为1、3、4,和预期结果一致。
内容的提问来源于stack exchange,提问作者Datamaniac
相关产品推荐
相关产品推荐

