Interpreting "condition has length > 1" warning from `if` function
maybe you want ifelse
:
a <- c(1,1,1,1,0,0,0,0,2,2)ifelse(a>0,a/sum(a),1) [1] 0.125 0.125 0.125 0.125 1.000 1.000 1.000 1.000 [9] 0.250 0.250
if
statement is not vectorized. For vectorized if statements you should use ifelse
. In your case it is sufficient to write
w <- function(a){if (any(a>0)){ a/sum(a)} else 1}
or a short vectorised version
ifelse(a > 0, a/sum(a), 1)
It depends on which do you want to use, because first function gives output vector of length 1 (in else part) and ifelse
gives output vector of length equal to length of a
.
Here's an easy way without ifelse
:
(a/sum(a))^(a>0)
An example:
a <- c(0, 1, 0, 0, 1, 1, 0, 1)(a/sum(a))^(a>0)[1] 1.00 0.25 1.00 1.00 0.25 0.25 1.00 0.25