r - 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" ""
请帮忙!谢谢!
解决方案
使用数字数据:
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)
遍历逻辑:
找到
NA
s 并左移一列:cbind(!is.na(m)[,-1], FALSE) # [,1] [,2] [,3] # [1,] TRUE TRUE FALSE # [2,] TRUE FALSE FALSE # [3,] FALSE FALSE FALSE
我们可以将它乘以原始值
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
列总和,使用
colSums(..., na.rm = TRUE)
colSums(m * cbind(!is.na(m)[,-1], FALSE), na.rm = TRUE) # [1] 3 4 0
将该值分配给 的第二行
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
推荐阅读
- swiftui - 具有 ObservableObject 属性的 ObservableObject 未触发 SwiftUI 更新
- sql - 如果前一列值不为空,则更新表中的下一列
- environment-variables - 如何在 Gatsby 应用程序的 .env 文件中指定 URL?
- import - 在 Python3 中导入相邻模块
- html - 如何使用 CSS 在不同设备中计算我的 margin-top?
- angular - 无法为 WOFF、WOFF2 和 TTF 解码下载的字体
- apache-kafka - 给定时间段的批量消费者不适用于 Spring Cloud Stream(StreamListener)中的多个分区?
- r - 在 R 上安装“xml2”时遇到问题(来自 Redhat)
- spring - Spring 与 CDI 范围
- python - 如何在 Python 中分割每 2 行?