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
相关产品推荐
相关产品推荐

