You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:52:10