将字符向量列表转换为二进制矩阵

pli*_*cht 10 r list vector matrix

我正在 R 中工作,并且有一个命名的字符向量列表。每个载体描述了生物途径中存在的基因。

请参阅下面的示例:

gene_sets = list(pathwayX= c("Gene3"),pathwayY= c("Gene2", "Gene3"),pathwayz= c("Gene1", "Gene2","Gene3"))

> gene_sets
$pathwayX
"Gene3"

$pathwayY
"Gene2" "Gene3"

$pathwayZ
"Gene1" "Gene2" "Gene3"
Run Code Online (Sandbox Code Playgroud)

我想要做的是将列表转换为二进制矩阵,其中基因作为列,路径作为行。0 表示通路中不存在基因,1 表示通路中存在基因。

基因1 基因2 基因3
途径X 0 0 1
Y途径 0 1 1
Z通路 1 1 1

李哲源*_*李哲源 7

我们可以用

t(+sapply(gene_sets, "%in%", x = c("Gene1", "Gene2", "Gene3")))
Run Code Online (Sandbox Code Playgroud)

如果你想动态获取c("Gene1", "Gene2", "Gene3"),我们可以这样做

GeneID <- sort(unique(unlist(gene_sets)))

mat <- t(+sapply(gene_sets, "%in%", x = GeneID))  ## matrix output
colnames(mat) <- GeneID
#         Gene1 Gene2 Gene3
#pathwayX     0     0     1
#pathwayY     0     1     1
#pathwayz     1     1     1

data.frame(mat)  ## data.frame output
Run Code Online (Sandbox Code Playgroud)

我的印象是,基因问题通常很大而且稀疏。如果现实中有数十万个基因和通路,那么以下稀疏矩阵解决方案是最佳选择。

pathwayID <- names(gene_sets)
n1 <- lengths(gene_sets, use.names = FALSE)  ## number of genes in each pathway
genesVec <- unlist(gene_sets, use.names = FALSE)
GeneID <- sort(unique(genesVec))
i <- rep(1:length(n1), n1)
j <- match(genesVec, GeneID)
Matrix::sparseMatrix(i = i, j = j, x = rep.int(1, length(i)),
                     dimnames = list(pathwayID, GeneID))
#3 x 3 sparse Matrix of class "dgCMatrix"
#         Gene1 Gene2 Gene3
#pathwayX     .     .     1
#pathwayY     .     1     1
#pathwayz     1     1     1
Run Code Online (Sandbox Code Playgroud)


Sot*_*tos 7

一个想法是和ietable结合使用stack

t(table(stack(gene_sets)))

          values
ind        Gene1 Gene2 Gene3
  pathwayX     0     0     1
  pathwayY     0     1     1
  pathwayz     1     1     1
Run Code Online (Sandbox Code Playgroud)


Qui*_*ten 5

你也可以mtabulate这样使用qdapTools

gene_sets = list(pathwayX= c("gene3"),pathwayY= c("gene2", "gene3"),pathwayz= c("gene1", "gene2","gene3"))

library(qdapTools)
mtabulate(gene_sets)
#>          gene1 gene2 gene3
#> pathwayX     0     0     1
#> pathwayY     0     1     1
#> pathwayz     1     1     1
Run Code Online (Sandbox Code Playgroud)

由reprex 包于 2022 年 7 月 18 日创建(v2.0.1)