使用R中m * n数字矩阵的每列的正元素之和创建一个向量

时间:2017-04-11 06:30:33

标签: r matrix vector

我需要创建一个R函数,它将任意格式n * m的数值矩阵A作为输入,并返回一个与A的列数一样长的向量,该列包含正元素的总和每一栏。

我必须以两种方式做到这一点 - 第一个是嵌套循环,第二个是使用向量/矩阵运算的一个衬里。

到目前为止,我已经提出了以下代码,它创建了矩阵A的列数量大小的向量,但我似乎只能得到它给出矩阵的所有正元素的总和而不是每个柱:

colSumPos(A){

columns <- ncol(A)

v1 <- vector("numeric", columns)

    for(i in 1:columns)
    {
        v1[i] <- sum(A[which(A>0)])
    }
}

有人可以解释一下如何分别得到每列的总和,然后我如何简化处理嵌套循环的代码?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我们可以applyMARGIN=2一起使用循环列并获取大于0的sum元素

apply(A, 2, function(x) sum(x[x >0], na.rm = TRUE))
#[1] 1.8036685 0.7129192 0.9305136 2.6625824 0.0000000

或者用NA

替换小于或等于0的值后,另一个选项是colSums
colSums(A*NA^(A<=0), na.rm = TRUE)
#[1] 1.8036685 0.7129192 0.9305136 2.6625824 0.0000000

或通过更直接的方法

colSums(replace(A, A<=0, NA), na.rm = TRUE)
#[1] 1.8036685 0.7129192 0.9305136 2.6625824 0.0000000

或者如果没有NA元素(不需要na.rm=TRUE),我们可以用0替换小于或等于0的值并使其紧凑(如@ikop所评论)

colSums(A*(A>0))
#[1] 1.8036685 0.7129192 0.9305136 2.6625824 0.0000000

数据

set.seed(24)
A <- matrix(rnorm(25), 5, 5)

答案 1 :(得分:1)

如果使用for循环

,请尝试使用代码
sumColum <- function(A){
for(i in 1:nrow(A)){
    for(j in 1:ncol(A)){
        colSums(replace(A, A<=0, NA), na.rm = TRUE)
    }
}
colSums(A)

}