如何用dplyr的distinct保留每个sample_id分组下值唯一的列?
基于分组保留样本级唯一列的dplyr实现
需求说明
使用dplyr处理数据框,按sample_id列分组折叠数据,仅保留每个sample_id分组内值完全唯一的列(预先不知道哪些列符合条件),最终得到每个sample_id对应唯一行的结果。
示例数据
test <- data.frame(a=rep(1:3,each=2),b=rnorm(6),sample_id=factor(rep(1:3,each=2),labels=c("A","B","C")))
生成的数据:
a b sample_id 1 1 -1.6717346 A 2 1 0.3294801 A 3 2 0.9780187 B 4 2 0.5510816 B 5 3 -0.9349387 C 6 3 -0.5981711 C
期望结果
a sample_id 1 1 A 2 2 B 3 3 C
解决方案
核心思路是先自动识别所有分组内值唯一的列,再用distinct提取这些列的唯一行:
library(dplyr) # 1. 自动筛选符合条件的列名 unique_cols <- test %>% group_by(sample_id) %>% # 计算每列在当前分组内是否只有唯一值 summarise(across(everything(), ~n_distinct(.) == 1)) %>% # 确认该列在所有分组中都满足唯一值条件 summarise(across(everything(), all)) %>% # 筛选出符合条件的列并提取列名 select(where(~.)) %>% colnames() # 2. 提取目标列的唯一行 result <- test %>% distinct(all_of(unique_cols), .keep_all = FALSE)
代码解释
- 第一步通过两次
summarise完成列筛选:- 第一次按
sample_id分组,检查每列在组内的不同值数量是否为1; - 第二次汇总所有分组的结果,仅保留所有分组都满足“值唯一”的列,最后提取这些列的名称。
- 第一次按
- 第二步用
distinct结合all_of(unique_cols),直接保留目标列的唯一行,得到最终结果。
内容的提问来源于stack exchange,提问作者epurdom
相关产品推荐
相关产品推荐

