【问题标题】:Create a vector with the sum of the positive elements of each column of a m*n numeric matrix in R用 R 中 m*n 数值矩阵的每一列的正元素之和创建一个向量
【发布时间】:2017-04-11 06:30:32
【问题描述】:

我需要创建一个 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)])
    }
}

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

提前感谢您的帮助!

【问题讨论】:

    标签: r matrix vector


    【解决方案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
    

    或者另一个选项是colSums 将小于或等于 0 的值替换为 NA

    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)
    

    【讨论】:

    • 在第二种方法中,您也可以将否定元素替换为 0:colSums(A*(A&gt;0))
    • 我有点困惑......这些变体中的哪个使用嵌套循环?我认为嵌套循环必须使用 for 或 while 循环?
    • @sooki-sooki 为什么不用循环就可以更高效地使用嵌套循环?
    • @akrun 因为不幸的是它是问题的一部分。我必须给出 2 个答案……一个作为嵌套循环,另一个仅使用矩阵/向量运算。感谢您提供更高效的代码!
    • @sooki-sooki set.seed(24); A1 &lt;- matrix(rnorm(2000*2000), 2000, 2000); v1 &lt;- colSums(A1*(A1&gt;0));length(v1)# [1] 2000 如您所见,一切正常
    【解决方案2】:

    如果你使用 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)
    

    }

    【讨论】:

    • 这个答案非常适合小矩阵。但是,当我应用一个大的 (2000x2000) 矩阵时,它给了我所有矩阵元素的总和,而不是一个向量,其中包含每个单独列的正元素的总和。你知道为什么会这样吗?
    • 另外,它仍然在总结负值而不是把它们归零......?
    • 那么有没有办法使用 2000x2000 矩阵中的嵌套循环计算列的正值之和?
    • 使用循环很慢,但仍然如此
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    相关资源
    最近更新 更多