首页 > 解决方案 > R中的Sumif函数

问题描述

我在 R 中执行 Excel 的 SUMIF 函数时遇到问题。有 2 个矩阵,m 和 n。如果列 j+1 中的行 i+1 不为空,我希望矩阵 n 将矩阵 m 的每一列 j 的总和限制到第 i 行(不确定我是否说清楚了,下面是我的解释更清楚地了解我想要做什么)。

以下是我的代码:

m <- matrix(c(1,2,3,4,5,'',7,'',''), nrow = 3)

n <- matrix('', nrow = 2, ncol = 3)

for (j in 1:2) {
  n[2,j] <- sum(as.numeric(m[,j])[!is.na(m[,j+1])]
}

n[2,3] <- ''

下面是矩阵m:

> m <- matrix(c(1,2,3,4,5,'',7,'',''), nrow = 3)
> m
     [,1] [,2] [,3]
[1,] "1"  "4"  "7" 
[2,] "2"  "5"  ""  
[3,] "3"  ""   ""  

上述代码产生矩阵 n 的结果:

> n <- matrix('', nrow = 2, ncol = 3)
> n
     [,1] [,2] [,3]
[1,] ""   ""   ""  
[2,] ""   ""   ""  
 

但我希望代码产生这样的结果:

> n <- matrix('', nrow = 2, ncol = 3)
> n
     [,1] [,2] [,3]
[1,] ""   ""   ""  
[2,] "3"  "4"  ""  

请帮忙!谢谢!

标签: rfor-loopmatrixsum

解决方案


使用数字数据:

m <- matrix(c(1,2,3,4,5,NA,7,NA,NA), nrow = 3)
n <- matrix(NA, nrow = 2, ncol = 3)

前面的底线:

n[2,] <- colSums(m * cbind(!is.na(m)[,-1], FALSE), na.rm = TRUE)

遍历逻辑:

  1. 找到NAs 并左移一列:

    cbind(!is.na(m)[,-1], FALSE)
    #       [,1]  [,2]  [,3]
    # [1,]  TRUE  TRUE FALSE
    # [2,]  TRUE FALSE FALSE
    # [3,] FALSE FALSE FALSE
    
  2. 我们可以将它乘以原始值m,其中FALSE有效0

    m * cbind(!is.na(m)[,-1], FALSE)
    #      [,1] [,2] [,3]
    # [1,]    1    4    0
    # [2,]    2    0   NA
    # [3,]    0   NA   NA
    
  3. 列总和,使用colSums(..., na.rm = TRUE)

    colSums(m * cbind(!is.na(m)[,-1], FALSE), na.rm = TRUE)
    # [1] 3 4 0
    
  4. 将该值分配给 的第二行n

    n[2,] <- colSums(m * cbind(!is.na(m)[,-1], FALSE), na.rm = TRUE)
    n
    #      [,1] [,2] [,3]
    # [1,]   NA   NA   NA
    # [2,]    3    4    0
    

推荐阅读