【问题标题】:Matching and replacing with for loops匹配和替换 for 循环
【发布时间】:2016-04-23 07:23:41
【问题描述】:

for 循环有问题。

我正在尝试从每个途径(途径矩阵)中获取元素 a b c d 并将它们与表达数据(表达矩阵)进行匹配,并将它们放入一个看起来类似于途径矩阵但现在包含来自表达矩阵的元素的新矩阵中。

我正在努力实现这个最终的矩阵结果。

a <- c("pathway","1","4","7","pathway-2","1","e","g","pathway-3","4","g","h")
pathway<-matrix(a,3,4, byrow=T)

代码将比我希望的措辞更容易理解。

a <- c("pathway","b","c","d","pathway-2","b","e","g","pathway-3","c","g","h")
pathway<-matrix(a,3,4, byrow=T)

b <- c("b",1,"c",4,"d",7)
expression<-matrix(b,3,2, byrow=T)

new<-matrix("a",3,4)
new[1:3,1]<-pathway[,1]

for (x in 1:nrow(expression)){
  for (y in 1:ncol(pathway)){
    if(expression[x,1]==pathway[x,y]){
      new[x,y]<-expression[x,2]
    }
  }
}

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    这是一种方法。我们将pathway[,-1] 的每一列与expression[,1] 矩阵相匹配,并将生成的矩阵用作expression[,2] 中值的索引。未找到的返回NA,因此我们对它们进行索引并从原始矩阵中替换它们。然后像往常一样cbind 得到想要的矩阵。

    new_m <- apply(pathway[, -1], 2, function(i) expression[,2][match(i, expression[,1])])
    new_m[which(is.na(new_m))] <- pathway[,-1][which(is.na(new_m))]
    cbind(pathway[,1], new_m)
    #     [,1]        [,2] [,3] [,4]
    #[1,] "pathway"   "1"  "4"  "7" 
    #[2,] "pathway-2" "1"  "e"  "g" 
    #[3,] "pathway-3" "4"  "g"  "h"
    

    【讨论】:

    • 优秀的解决方案.....似乎你可以用new_m[, -1] &lt;- apply(pathway[, -1], ......)避免cbind
    • 谢谢... 那么为什么循环不起作用呢?这不能用循环来完成吗?我知道 apply 是一个循环,但我的意思是 for 循环......问题是这是实际数据的 sn-p......并且在实际路径数据框中有 2000 列......
    • 我想这应该仍然有效,不管列数是多少
    • @ComputerNoob,是的。只要第一列总是被排除,那么它将适用于任意数量的列。
    • @Sotos 你能告诉我为什么我的循环不工作......这真的很困扰我