我需要创建一个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)])
}
}
有人可以解释一下如何分别得到每列的总和,然后我如何简化处理嵌套循环的代码?
提前感谢您的帮助!
答案 0 :(得分:1)
我们可以apply
与MARGIN=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)
}