第4篇中生成的表达矩阵存在几个问题:
因为是基于转录本比对,所以“Gene_id”一列会出现一个基因多个转录本的情况;
存在大量的4组count都为0的基因行。
在python中进行处理:
import pandas as pd
# 读取数据,自动解析多个空格
df = pd.read_csv("merged_counts.txt", sep=r"\s+", engine="python")
print(df.columns) # 再次检查列名是否正确
print(df[["Gene_id"]].head(10))
Index(['Gene_id', 'BC07', 'BC08', 'BC07_2', 'BC08_2'], dtype='object')
Gene_id
0 4933401J01Rik-201
1 Gm26206-201
2 Xkr4-203
3 Xkr4-202
4 Xkr4-201
5 Gm18956-201
6 Gm37180-201
7 Gm37363-201
8 Gm37686-201
9 Gm1992-201
df["Gene_id_trimmed"] = df["Gene_id"].str.split("-").str[0]
print(df[["Gene_id", "Gene_id_trimmed"]].head(10)) # 看看是否被截断错误
Gene_id Gene_id_trimmed
0 4933401J01Rik-201 4933401J01Rik
1 Gm26206-201 Gm26206
2 Xkr4-203 Xkr4
3 Xkr4-202 Xkr4
4 Xkr4-201 Xkr4
5 Gm18956-201 Gm18956
6 Gm37180-201 Gm37180
7 Gm37363-201 Gm37363
8 Gm37686-201 Gm37686
9 Gm1992-201 Gm1992
# 仅保留数值列 + 基因 ID
df_numeric = df.drop(columns=["Gene_id"]) # 先去掉原始基因 ID 列
# 按基因 ID 进行合并(去掉后缀),仅合并数值列
df_gene = df_numeric.groupby("Gene_id_trimmed", sort=False).sum()
# 只保留在所有样本中 count 之和大于 0 的基因
df_gene = df_gene[df_gene.sum(axis=1) > 0]
# 保存合并后的数据
df_gene.to_csv("merged_gene_counts.txt", sep="\t")
# 查看前几行
print(df_gene.head())
BC07 BC08 BC07_2 BC08_2
Gene_id_trimmed
Gm37329 0 1 0 0
Gm38148 0 0 0 2
Gm19938 0 0 0 1
ENSMUST00000371377 0 0 1 0
ENSMUST00000371375 0 0 1 0
这样就生成了我想要的可以进行差异分析的表达矩阵了。其中.groupby("Gene_id_trimmed").sum()
会自动合并相同基因 ID 的行,因此不会出现重复的基因行名。