“If”函数在apply中工作错误

时间:2015-11-12 22:13:10

标签: r

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

为什么会这样?

1 个答案:

答案 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:3x = 4:6上对其进行测试以确定。

x = 1:3
sum(x[x > 2])
# [1] 3
x = 4:6
sum(x[x > 2])
# [1] 15

在这种情况下我们也可以采取捷径。 test > 2会提供TRUEFALSE - 相当于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