test<-matrix(1:9,3,3)
test
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
我想计算每列的总和,尤其是当值大于2时。 我想要的结果是
3 15 24
我使用了以下代码:
apply(test,2,function(x){
if (x>2){
sum<-sum(x)
}
return(sum)
}
)
结果是这样的:
[[1]]
function (..., na.rm = FALSE) .Primitive("sum")
[[2]]
[1] 15
[[3]]
[1] 24
为什么会这样?
答案 0 :(得分:3)
当我运行你的代码时,我收到很多警告:
Warning messages:
1: In if (x > 2) { :
the condition has length > 1 and only the first element will be used
警告是有帮助的,不要忽视它们!
您的第一列是向量x = 1:3
。如果您对其运行if(x > 2)
,则返回FALSE
,因为if()
仅用于评估单个条件,因此它仅测试第一个元素1
。它还会发出如上所述的警告,让您知道可能出现的问题。如果未触发if()
,则您要运行的下一行代码为return(sum)
- 此时R知道的唯一sum
对象是函数sum
,所以这是返回的,因此输出:
[[1]]
function (..., na.rm = FALSE) .Primitive("sum")
我认为你的意思是:
apply(test, 2, function(x){
sum(x[x > 2])
}
)
# [1] 3 15 24
这会将x
的值加上大于2的值。您可以在x = 1:3
或x = 4:6
上对其进行测试以确定。
x = 1:3
sum(x[x > 2])
# [1] 3
x = 4:6
sum(x[x > 2])
# [1] 15
在这种情况下我们也可以采取捷径。 test > 2
会提供TRUE
或FALSE
- 相当于1或0 - 取决于值。
test > 2
# [,1] [,2] [,3]
# [1,] FALSE TRUE TRUE
# [2,] FALSE TRUE TRUE
# [3,] TRUE TRUE TRUE
如果我们将这个(元素方面)与test
相乘,则false值会将小于2的值归零
test * (test > 2)
# [,1] [,2] [,3]
# [1,] 0 4 7
# [2,] 0 5 8
# [3,] 3 6 9
在此我们可以使用方便的colSums
函数
colSums(test * (test > 2))
# [1] 3 15 24