【问题标题】:Sumif function in RR中的Sumif函数
【发布时间】:2020-10-15 11:35:13
【问题描述】:

我在 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"  ""  

请帮忙!谢谢!

【问题讨论】:

  • 你为什么要强制 character 然后 sum(as.numeric(.))?将NA 用于矩阵中的空值会好得多。
  • 当你只在第二行有值时,为什么你需要n 中的第一行为空(“”)?
  • 感谢您的回复@r2evans!但是将 '' 更改为 NA 并不能解决问题:(
  • @RonakShah 这是从我的 R 闪亮应用程序中提取的一个简单而简短的内容,它比这更复杂。我想将 sumif 值放入第二个矩阵的第二行。

标签: r for-loop matrix sum


【解决方案1】:

使用数字数据:

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
    

【讨论】:

  • 感谢@r2evans 的详细解释,这就像一个魅力!
【解决方案2】:

矩阵只能包含一个类,因此具有空字符值 ("") 会将所有数字变量更改为字符。您可以改用NA,这将保持课程完整,您可以sum 它。另外,当您的实际数据仅出现在最后一行时,我真的不明白为什么您需要额外的空(或 NA)行。

话虽如此,您可以按列使用 apply 到 sum 的值,直到在该列中找到最后一个非 NA 值 - 1。

m <- matrix(c(1,2,3,4,5,NA,7,NA,NA), nrow = 3)
n <- matrix(NA, nrow = 2, ncol = 3)
n[2, ] <- apply(m, 2, function(x) sum(x[seq_len(max(which(!is.na(x))) - 1)]))
n

#     [,1] [,2] [,3]
#[1,]   NA   NA   NA
#[2,]    3    4    0

【讨论】:

  • 感谢@Ronak,但是如何将此向量转换回具有 2 行的矩阵,如上面的矩阵 n?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
相关资源
最近更新 更多