如何按首行Cohort值分组计算基因表达数据的行均值?
解决方法
首先注意你的数据集结构:当前是基因/分组作为行,样本作为列,需要先转置调整结构,让样本成为行,Cohort和各基因成为列,这样才能按Cohort分组计算均值。
步骤1:整理数据集(以R为例)
先把数据读入并转置:
# 构造原始数据 data <- data.frame( row_names = c("Cohort", "G1", "G2", "G3", "G4"), S1 = c(1, 23, 11, 45, 67), S2 = c(2, 44, 78, 46, 77), S3 = c(1, 67, 88, 56, 22), S4 = c(1, 13, 30, 66, 45) ) # 转置并重新命名列 data_t <- t(data[, -1]) colnames(data_t) <- data$row_names data_t <- as.data.frame(data_t)
转置后的数据结构:
Cohort G1 G2 G3 G4 S1 1 23 11 45 67 S2 2 44 78 46 77 S3 1 67 88 56 22 S4 1 13 30 66 45
步骤2:按Cohort分组计算基因均值
方法一:用base R的aggregate()函数
这是最简便的基础方法,直接按Cohort分组,计算所有基因列的均值:
aggregate(. ~ Cohort, data = data_t, FUN = mean)
输出结果:
Cohort G1 G2 G3 G4 1 1 34.33333 43.00000 55.66667 44.66667 2 2 44.00000 78.00000 46.00000 77.00000
方法二:用dplyr包(更直观的语法)
如果习惯tidyverse风格,用dplyr的分组汇总:
library(dplyr) data_t %>% group_by(Cohort) %>% summarise(across(G1:G4, mean))
得到的结果和上面一致。
关于if()报错的原因
你用if(data$cohort ==1)报错是因为data$cohort ==1返回的是一个长度大于1的布尔向量(每个样本对应一个TRUE/FALSE),而**if()只能处理长度为1的条件**。如果要对每个元素做判断,应该用ifelse(),但这里更适合用分组聚合的方法,比逐个判断高效得多。
内容的提问来源于stack exchange,提问作者Ankita
相关产品推荐
相关产品推荐

