我有一个“作业”来生成记录一些匹配信息的矩阵。我知道我可以很容易地通过for循环解决这个问题,但是我确实有一个相当大的矩阵,最终将无休止地等待着。我希望能有一种更快的方法。
基本上,我要做的是找到匹配的基因表达和途径。具体而言,如果基因(例如基因1)属于途径(例如途径1),则将相应的表达赋予gene1-pathway1组合。但是,如果该基因不在该途径中,则分配0。看,很简单,但是我被困住了。请参见下面的示例来表达我想要得到的东西。
path <- read.table(header = T,text = "pathway gene
pathway1 gene1
pathway1 gene2
pathway1 gene3
pathway1 gene4
pathway2 gene1
pathway2 gene5
pathway3 gene3
pathway3 gene6
pathway3 gene7
")
expr <- read.table(header = T,text = "gene expression
gene1 1
gene2 2
gene3 3
gene4 4
gene5 5
gene6 6
gene8 8
")
out <- matrix(0,
nrow = length(unique(path$pathway)),
ncol = length(unique(expr$gene)),
dimnames = list(unique(path$pathway),unique(expr$gene)))
for (p in rownames(out)) {
for (g in colnames(out)) {
tmp <- path[which(path$pathway == p),]
if(is.element(g,tmp$gene)) {
out[p,g] <- expr[which(expr$gene == g),"expression"]
} else {next()}
}
}
print(out)
# gene1 gene2 gene3 gene4 gene5 gene6 gene8
# pathway1 1 2 3 4 0 0 0
# pathway2 1 0 0 0 5 0 0
# pathway3 0 0 3 0 0 6 0
上面已经打印了预期的输出,但是我想知道是否有更快的方法(我的意思是说真的更快)到达那里,因为我要处理的矩阵很大。
希望有人能给我一些帮助。非常感谢!
答案 0 :(得分:2)
看起来在最终输出中,您仅需要expr
中存在的那些基因(因为最终输出中不存在gene7
)。使用基数R,我们只能首先过滤这些值,然后使用gene
指定的factor
将levels
设为expr$gene
变量,然后使用table
来获取< / p>
path = path[path$gene %in% expr$gene, ]
path$gene <- factor(path$gene, levels = expr$gene)
table(path)
# gene
#pathway gene1 gene2 gene3 gene4 gene5 gene6 gene8
# pathway1 1 1 1 1 0 0 0
# pathway2 1 0 0 0 1 0 0
# pathway3 0 0 1 0 0 1 0
但是,如果您想将这些1替换为expression
,我们可以
df1 <- as.data.frame.matrix(table(path))
mapply(function(x, y) replace(x, x!= 0, y), df1, expr$expression)
# gene1 gene2 gene3 gene4 gene5 gene6 gene8
#[1,] 1 2 3 4 0 0 0
#[2,] 1 0 0 0 5 0 0
#[3,] 0 0 3 0 0 6 0
答案 1 :(得分:1)
它提供了所需的输出,我知道可能有更简单的方法,但是它起作用了,请告诉我它是否更快:
let urlWithoutFileExtension: URL = originalFileUrl.deletingPathExtension()
let fileNameWithoutExtension: String = urlWithoutFileExtension.lastPathComponent