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

时间:2015-04-09 04:16:49

标签: r

我在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 个答案:

答案 0 :(得分:1)

逻辑操作&amp;相当于二进制乘法。因此,您可以将条件简化为逐列乘法,然后计算总和。

> 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