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