如何在没有for循环的情况下匹配某些信息

时间:2019-06-09 08:00:49

标签: r dataframe

我有一个“作业”来生成记录一些匹配信息的矩阵。我知道我可以很容易地通过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

上面已经打印了预期的输出,但是我想知道是否有更快的方法(我的意思是说真的更快)到达那里,因为我要处理的矩阵很大。

希望有人能给我一些帮助。非常感谢!

2 个答案:

答案 0 :(得分:2)

看起来在最终输出中,您仅需要expr中存在的那些基因(因为最终输出中不存在gene7)。使用基数R,我们只能首先过滤这些值,然后使用gene指定的factorlevels设为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