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 |
我们可以用
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)
一个想法是和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)
你也可以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)
| 归档时间: |
|
| 查看次数: |
581 次 |
| 最近记录: |