首页 > 解决方案 > 如何使用大字符向量对矩阵进行子集化

问题描述

我对 R 很陌生,我正在处理一个大型基因组矩阵,我正在使用某些基因准备热图。我对包含我感兴趣的基因的矩阵进行了子集化。

我试着这样做:

vector_infertility_genes <- infertility$V1

matrix_for_heatmap_infertility <- subset(my_genomic_matrix, vector_infertility_genes)

但这只给了我矩阵中的前 x 行,其中 x 是我在 vector_infertility 基因中的字符数。

到目前为止,我能够通过执行以下操作来避开这个问题:

matrix_for_heatmap_infertility <- my_genomic_matrix[c('EPHX1', 'HSPB1', 'CLU', 'GAMT',  'PICK1', 'NR3C1',
                                                                 'SIRT1', 'NPAS2', 'SPRY4', 'MAP3K1', 'SOS1', 'SALL4', 
                                                                 'GRIP1', 'PUM2', 'SOX9', 'RIPK4', 'CHD7',  'BCOR', 
                                                                 'CCNB1', 'NFE2L2', 'CHD2', 'CYP1B1', 'MDM2', 'CREBBP',
                                                                 'ICK', 'ZFY', 'SIN3A', 'GATA4'), ]

如果我必须再次手动键入每个基因的行名到这样的子集,我会自杀。有没有更简单的方法来创建一个字符向量并将其用于子集?

标签: rvectorcharactersubset

解决方案


我正在猜测这个问题。您的基因是因子,当您使用它们对矩阵进行子集化时,它们将转换为数字:

genes = c('EPHX1','HSPB1', 'CLU', 'GAMT','PICK1', 'NR3C1','SIRT1', 'NPAS2',
'SPRY4', 'MAP3K1', 'SOS1', 'SALL4','GRIP1', 'PUM2', 'SOX9', 'RIPK4', 'CHD7', 
'BCOR','CCNB1','NFE2L2', 'CHD2', 'CYP1B1', 'MDM2', 'CREBBP', 'ICK', 'ZFY',
'SIN3A', 'GATA4')

class(genes)
[1] "character"

infertility = data.frame(V1=genes)
vector_infertility_genes <- infertility$V1

class(vector_infertility_genes)
[1] "factor"

默认情况下,data.frame 将字符作为向量,现在我在下面创建一个带有一些随机基因名称的矩阵,并插入从 101-128 中选择的基因:

my_genomic_matrix = matrix(runif(1000*3),ncol=3)
rownames(my_genomic_matrix) = paste0("gene",1:1000)
rownames(my_genomic_matrix)[101:128] = genes

这给了你一些奇怪的东西:

head(my_genomic_matrix[vector_infertility_genes,])
            [,1]       [,2]       [,3]
gene8  0.6705400 0.92836211 0.39245031
gene12 0.6550523 0.87094037 0.08309788
gene5  0.3737798 0.94779178 0.44279510
gene9  0.4544450 0.77939541 0.13901245
gene19 0.6284895 0.47871950 0.60837784
gene18 0.2369957 0.01336282 0.10390174

这在大多数情况下应该有效,只要您确定您的 vector_infertility_genes 在 my_genomic_matrix 的行名中:

head(my_genomic_matrix[as.character(vector_infertility_genes),])
           [,1]       [,2]      [,3]
EPHX1 0.1380852 0.91638593 0.5155086
HSPB1 0.4828377 0.44798223 0.6011990
CLU   0.7974677 0.84083760 0.4378384
GAMT  0.9654133 0.04167125 0.6087020
PICK1 0.1958134 0.22254847 0.5157768
NR3C1 0.4228220 0.14512706 0.6136789

如果缺少一些,您还可以执行以下操作:

vector_infertility_genes = as.character(vector_infertility_genes)
my_genomic_matrix[rownames(my_genomic_matrix) %in% vector_infertility_genes,]

推荐阅读