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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:36:01