Interpreting "condition has length > 1" warning from `if` function Interpreting "condition has length > 1" warning from `if` function r r

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