如何在R中同时汇总多列 实现按Sample ID合并基因计数表冗余行
解决方案
方案1:tidyverse(dplyr)方案(代码易读,适配常规数据量)
你当前数据里的缺失值用-表示,需要先转换为NA并转为数值型才能正常求和,之后用across()函数批量处理所有基因列,无需手动逐列编写代码:
# 加载依赖包 library(tidyverse) # 1. 数据预处理:替换所有基因列的'-'为NA并转为数值格式 processed_df <- data.wide.df %>% mutate(across(!SampleId, ~as.numeric(ifelse(. == "-", NA, .)))) # 2. 按SampleID分组,批量对所有基因列求和 dfwide <- processed_df %>% group_by(SampleId) %>% summarise(across(everything(), ~sum(., na.rm = TRUE)))
- 代码说明:
across(!SampleId)表示选中除SampleId外的所有列,哪怕有上万个基因列也可以自动适配。
方案2:data.table方案(运行速度更快,适配超大数据量)
如果你的数据量极大,用data.table可以获得更高的运行效率:
library(data.table) # 转换为data.table格式 setDT(data.wide.df) # 预处理:替换所有基因列的'-'为NA并转数值 gene_cols <- setdiff(names(data.wide.df), "SampleId") data.wide.df[, (gene_cols) := lapply(.SD, function(x) as.numeric(ifelse(x == "-", NA, x))), .SDcols = gene_cols] # 分组汇总所有基因列 dfwide <- data.wide.df[, lapply(.SD, sum, na.rm = TRUE), by = SampleId]
注意事项
- 如果你的原始数据中
-已经默认替换为NA且基因列本身就是数值型,可以直接跳过预处理步骤,直接执行分组汇总代码即可。 - 若你的原始数据是三列长结构(列名分别为SampleId、基因名、计数),可以直接用
pivot_wider(names_from = 基因名, values_from = 计数)一步完成转换。
内容的提问来源于stack exchange,提问作者skabir
相关产品推荐
相关产品推荐

