# How to compute the number of none NA-values for each row?

I have a matrix(raster) that I am computing the the mean of each row in this raster as:

``````  library (raster)
r <- raster(nrows=10, ncols=10);r <- setValues(r, 1:ncell(r))

# The x-values will be the mean of each row in the raster:
xvals = rowMeans(as.matrix(r))
``````

What I need is to know how many values were considered when computing the mean for each row (N)? Some pixels may have NA so the number of values will not be the same in each row.

You can use apply, which is actually the basis of the rowMeans function. If you are concerned that your row means are not correct because of NA's, just use the na.rm = TRUE argument in rowMeans.

``````library (raster)
r <- raster(nrows=20, ncols=10)
r[] <- runif(ncell(r))
r[sample(1:ncell(r),10)] <- NA

( r <- as.matrix(r) )

# Count number of NA values
apply(r, MARGIN = 1, FUN = function(x) length(x[is.na(x)]) )

# Calculate "true" n, accounting for NA's
apply(r, MARGIN = 1, FUN = function(x) length(x[!is.na(x)]) )
``````
• It's much faster (and even a little simpler) to use something like `rowSums(!is.na(r))`. – whuber Apr 14 '15 at 16:13
• Yes, rowSums is faster (1.06s) than apply (8.49s) on a 10,000 x 10,000 matrix. But I would say that on a matrix that large, 9 seconds is not bad. I mostly like showing the guts of things for teaching purposes and think that optimization comes later. I think that to is good to know how to apply custom functions to the a matrix but, using rowSums is more straight forward and to the point of the OP's question. – Jeffrey Evans Apr 14 '15 at 18:00
• Good points. There is both a pedagogical and a conceptual point to the `rowSums` solution in this case, though: the opportunities to capitalize on the type-punning that equates `TRUE` with 1 and `FALSE` with 0 are numerous and frequently overlooked. Here it amounts to the difference between counting objects (`length(x[is.na(x)]))`) and summing indicator functions (`rowSums(!is.na(r)))`). – whuber Apr 14 '15 at 21:00