我在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"

我想做的是将列表转换成一个二进制矩阵,将基因作为列,路径作为行.0表示途径中不存在基因,1表示存在基因.

Gene1 Gene2 Gene3
pathwayX 0 0 1
pathwayY 0 1 1
pathwayZ 1 1 1

推荐答案

我们可以使用

t(+sapply(gene_sets, "%in%", x = c("Gene1", "Gene2", "Gene3")))

如果你想动态获得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

我的印象是,基因问题通常是大而稀疏的.如果你在现实中有几十万个基因和通路,那么下面的稀疏矩阵解决方案是最好的 Select .

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

R相关问答推荐

R:将列名的字符载体传递给可以 Select 接受多个参数的函数

R中的滞后累积量

在R中,将一个函数作为输入传递给另一个函数时进行参数判断

棒棒糖图表大小和线宽参数故障标签未出现

如何在ggplot 2线性图的每个方面显示每个组的误差条?

如何使用rmarkdown和kableExtra删除包含折叠行的表的第一列的名称

如何根据条件计算时差(天)

当我们有多个特殊字符时,使用gsub删除名称和代码'

从服务器在Shiny中一起渲染图标和文本

如何在R中平滑地绘制线图(不拟合)?

`夹心::vcovCL`不等于`AER::tobit`标准错误

汇总数据帧中的复制列,保持行的唯一性

从多面条形图中删除可变部分

根据纬度和距离连接两个数据集

如何对r中包含特定(未知)文本的行求和?

删除数据帧中特定行号之间的每第三行和第四行

层次树图的数据树

如果条件匹配,则使用Mariate粘贴列名

如何构建一个for循环来循环处理动物ID?

R预测包如何处理ARIMA(Auto.arima函数)中的缺失值