基于列条件使用dplyr对重复测量数据框进行分组筛选
看起来你已经有了分组的思路,现在只需要在分组内根据Pheno的值来筛选对应的行就行。我来帮你完善代码,用dplyr就能轻松实现你的需求。
首先,结合你给出的理想结果,你的核心需求应该是:每个ID分组里,如果存在Pheno=1的行,就选其中Week最小的那一行;如果该分组只有Pheno=0的行,就选其中Week最大的那一行。
下面是具体的实现代码:
library(dplyr) # 假设你的原始数据框名为data df_sub <- data %>% group_by(ID) %>% filter( # 筛选Pheno=1且为该组内最小Week的行 (Pheno == 1 & Week == min(Week[Pheno == 1])) | # 当组内全是Pheno=0时,筛选Week最大的行 (all(Pheno == 0) & Pheno == 0 & Week == max(Week)) ) %>% ungroup()
如果你需要更灵活的处理——比如某些ID分组里同时存在Pheno=0和Pheno=1的行,想要同时保留Pheno=1的最小Week行和Pheno=0的最大Week行(每个ID可能对应两行结果),可以用下面的代码:
df_sub <- data %>% group_by(ID, Pheno) %>% filter( # 根据Pheno值选择对应极值的行 if_else(Pheno == 1, Week == min(Week), Week == max(Week)) ) %>% ungroup()
代码解释:
group_by(ID):按个体ID分组,确保筛选逻辑在每个个体的重复测量数据范围内执行。filter()条件:- 第一部分针对
Pheno=1的行,精准筛选出该组内Week最小的记录; - 第二部分先判断该组是否全为
Pheno=0的行,若是则筛选出Week最大的记录。
- 第一部分针对
ungroup():取消分组,将结果还原为普通数据框结构,方便后续操作。
运行这段代码后,应该就能得到你想要的理想筛选结果了。
内容的提问来源于stack exchange,提问作者user2380782
相关产品推荐
相关产品推荐

