R语言如何按Gene字段对基因表达数据集所有观测列执行聚合求和
错误原因
你代码报错的核心问题是res$dataColumns的写法错误:R会将dataColumns识别为res数据集的某一列名,而不是你预先定义的列名字符串向量,因此无法正确选中需要聚合的166个观测列,最终触发no rows to aggregate的报错。
解决方案
方案1:基础R aggregate 原生写法(无需额外安装包)
正确的多列选择语法是res[, dataColumns],修改后代码如下:
# 预先定义需要聚合的观测列 dataColumns <- c("V1","V2","V3","V4","V5","V6","V7","V8","V9","V10","V11","V12","V13","V14","V15","V16","V17","V18","V19","V20","V21","V22","V23","V24","V25","V26","V27","V28","V29","V30","V31","V32","V33","V34","V35","V36","V37","V38","V39","V40","V41","V42","V43","V44","V45","V46","V47","V48","V49","V50","V51","V52","V53","V54","V55","V56","V57","V58","V59","V60","V61","V62","V63","V64","V65","V66","V67","V68","V69","V70","V71","V72","V73","V74","V75","V76","V77","V78","V79","V80","V81","V82","V83","V84","V85","V86","V87","V88","V89","V90","V91","V92","V93","V94","V95","V96","V97","V98","V99","V100","V101","V102","V103","V104","V105","V106","V107","V108","V109","V110","V111","V112","V113","V114","V115","V116","V117","V118","V119","V120","V121","V122","V123","V124","V125","V126","V127","V128","V129","V130","V131","V132","V133","V134","V135","V136","V137","V138","V139","V140","V141","V142","V143","V144","V145","V146","V147","V148","V149","V150","V151","V152","V153","V154","V155","V156","V157","V158","V159","V160","V161","V162","V163","V164","V165","V166") # 按Gene列分组,对所有观测列求和 trans_grouped <- aggregate(res[, dataColumns], by=list(Gene=res$Gene), FUN=sum)
如果你不想手动写全166个V开头的列名,还可以用正则匹配自动筛选,简化代码:
# 自动匹配所有以V开头的观测列,无需手动枚举 dataColumns <- grep("^V\\d+$", colnames(res), value = TRUE) trans_grouped <- aggregate(res[, dataColumns], by=list(Gene=res$Gene), FUN=sum)
方案2:dplyr包写法(20万行大数据量运行效率更高)
针对你20万行的大型数据集,更推荐使用dplyr包做聚合,运行速度远高于基础R的aggregate:
# 未安装包先运行:install.packages("dplyr") library(dplyr) trans_grouped <- res %>% group_by(Gene) %>% # 对所有V开头的观测列求和,na.rm=TRUE可跳过空值,不需要可以删除 summarise(across(starts_with("V"), sum, na.rm = TRUE)) %>% ungroup() %>% as.data.frame()
内容的提问来源于stack exchange,提问作者Jed Lye
相关产品推荐
相关产品推荐

