首页 文章

在R中的矩阵上使用apply函数

提问于
浏览
-1

我在R中有一个矩阵,格式如下:

A B C D E
1 0 0 1 0
0 0 1 0 1
1 1 1 0 1
.
.
.

我需要将每行的值与行D&E中的相应值进行比较 . 例如:

if(mat[1,1] == 1 && mat[1,4]==1)
   vec[1]+=1
else if(mat[1,1] == 1 && mat[1,5]==1)
   vec[1]-=1

基本上,如果第4列中的1的数量大于第5列中的1的数量,则 vec 将为正数 .

为此,我传递使用apply函数,该函数按行调用元素,然后运行从1到列数的循环,并执行上述条件,如下所示:

outputv = vector(,ncol(mat))

A <- function(vec){

    for(i in 1:length(vec)-2)
      {
         if(vec[i]==1 &&vec[length(vec)-1]==1)
             outputv[i] = outputv[i] + 1
         else if(vec[i] == 1&& vec[length(vec)-2]==1)
             outputv[i] = outputv[i] - 1
      }

}
apply(mat,1,A)

我确实认识到循环不是一种有效的方法,但即使采用这种方法,outputv中的值都是0 .

给定输入矩阵的预期输出v将是

0 1 2

对于第一列,1出现在第1行和第3行 . 在第一行第4列中,有1,减1.第3第5列有1,所以加1总= -1 1 = 0

1 回答

  • 1

    逻辑运算&等同于二进制乘法 . 因此,您可以将条件简化为逐列乘法,然后计算总和 .

    > mat <- as.matrix(read.table(
    + text = "
    + A B C D E
    + 1 0 0 1 0
    + 0 0 1 0 1
    + 1 1 1 0 1", header = TRUE ) )
    > 
    > outputv <- rep(0, ncol(mat)-2 )     # initialize vector with zeros
    > 
    > for (n in 1:(ncol(mat)-2) )         # calculate outputv in loop
    +   outputv[n] <- sum( mat[,n]*(-mat[,ncol(mat)-1] +mat[,ncol(mat)]) )   
    > outputv
    [1] 0 1 2
    > vec <- sum(outputv)
    > vec
    [1] 3
    

    但最好(和快速)的解决方案可能是基于矩阵乘法的这种方法:

    - (mat[,ncol(mat)-1] %*% mat[,1:(ncol(mat)-2)] ) +
      mat[,ncol(mat)] %*% mat[,1:(ncol(mat)-2)]
    

    它提供了所需的输出:

    A B C
    [1,] 0 1 2
    

相关问题