统计矩阵中非零列的数量

3

我有一个矩阵mat。其中一些列是全零的,而另一些列是非零的。如何计算非零的列数?

mat<-matrix(rep(0,2*5),ncol=2)
mat[,1]=c(1,2,3,4,5)

期望的结果是1

2
尝试使用sum(colSums(mat == 0) != 0) - akrun
2个回答

5
如果您想要筛选出具有非零元素的列,这意味着它们可能有零但不是所有行都是零,则可以使用以下方法:
mat<-matrix(rep(0,2*5),ncol=2)
mat[,1]=c(1,2,3,4,5)

sum(colSums(mat!=0)!=0)
#> [1] 1

但是,如果您想找到没有零的列,请看下面。我将举一个例子来更好地阐述:

mat2<-matrix(rep(0,4*5),ncol=4)
mat2[,1]=c(0,2,3,4,5)
mat2[,2]=c(1,2,3,4,5)
mat2[,3]=c(0,0,0,-1,1)

sum(colSums(mat2!=0)!=0) #count of non-zero columns
#> [1] 3

sum(colSums(mat2!=0)==nrow(mat2)) #count of columns with no zeros
#> [1] 1

如果您想查找哪些列是非零的,请使用 which 而不是 sum :
which(colSums(mat2!=0)!=0) #non-zero columns
#> [1] 1 2 3


which(colSums(mat2!=0)==nrow(mat2)) #columns with no zeros
#> [1] 2

@M-M,您能否展示如何识别哪些列是“非零列”?即第1、2和3列。 - adm
1
@adm 使用which()代替sum()。例如:which(colSums(mat!=0)!=0) - M--

1
我们可以逐列使用apply函数,并统计具有任何非零值的列数。
sum(apply(mat != 0, 2, any))
#[1] 1

或者,如果您想要具有所有非零值的列。
sum(apply(mat != 0, 2, all))

有人在使用apply时使用了max,但由于它不能处理所有负列,所以删除了他们的答案。我在这里留下这个评论,因为它更像是你的解决方案:sum(apply(mat, 2, function(y) max(abs(y)))!=0) - M--

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接