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

R语言按ID、sample type分组保留最大Aliquot Number行方法

R语言分组保留组内最大Aliquot Number行实现方案

需求为:按ID、sample type两个字段分组,每组仅保留Aliquot Number值最大的1行记录,以下提供三种可直接运行的实现方式,运行逻辑完全匹配筛选规则。


方法1:dplyr 实现(语法易读,适合常规数据处理场景)

这是目前最常用的tidyverse数据处理写法,代码可读性强:

# 加载dplyr包,若未安装先运行 install.packages("dplyr")
library(dplyr)

# 原始数据存储为df,运行以下代码得到结果
result <- df %>%
  group_by(ID, `sample type`) %>% # 按两个维度分组,列名带空格需用反引号包裹
  filter(`Aliquot Number` == max(`Aliquot Number`)) %>% # 筛选组内序号最大的行
  ungroup() # 取消分组,避免后续操作受分组属性影响

注:如果同组内存在多个相同最大序号的行,代码会全部保留;若确认每组最大值唯一,输出结果行数和结构将完全匹配需求。

方法2:data.table 实现(性能优异,适合大数据量场景)

如果数据集行数在百万级以上,优先选这个方法,运行速度远高于dplyr:

# 加载data.table包,若未安装先运行 install.packages("data.table")
library(data.table)

# 将数据框转换为data.table格式
setDT(df)

# 分组筛选最大值对应行
result <- df[, .SD[`Aliquot Number` == max(`Aliquot Number`)], by = .(ID, `sample type`)]

方法3:base R 实现(无需安装第三方包)

不想装额外包的话可以用R原生函数实现,逻辑简单直接:

# 生成匹配组内最大值的逻辑索引
match_max <- ave(df$`Aliquot Number`, df$ID, df$`sample type`, FUN = max) == df$`Aliquot Number`

# 提取符合条件的行得到结果
result <- df[match_max, ]

结果校验

运行以下代码可以校验输出结果和目标数据集是否一致(分组操作可能改变行顺序,排序后对比更准确):

# 假设目标数据集存储为target_df
all_equal(
  result %>% arrange(ID, `sample type`),
  target_df %>% arrange(ID, `sample type`)
)
# 控制台返回TRUE即代表结果完全匹配

内容的提问来源于stack exchange,提问作者JBrowne13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:21:51