An elegant way to count number of negative elements in a vector?

You want to read 'An Introduction to R'. Your answer here is simply

 sum(  x < 0  )

which works thanks to vectorisation. The x < 0 expression returns a vector of booleans over which sum() can operate (by converting the booleans to standard 0/1 values).


There is a good answer to this question from Steve Lianoglou How to identify the rows in my dataframe with a negative value in any column?

Let me just replicate his code with one small addition (4th point).

  1. Imagine you had a data.frame like this:

    df <- data.frame(a = 1:10, b = c(1:3,-4, 5:10), c = c(-1, 2:10))
    
  2. This will return you a boolean vector of which rows have negative values:

    has.neg <- apply(df, 1, function(row) any(row < 0))
    
  3. Here are the indexes for negative numbers:

    which(has.neg)
    
  4. Here is a count of elements with negative numbers:

    length(which(has.neg))
    

Tags:

R