On Jan 4, 2012, at 9:17 AM, peter dalgaard wrote:


On Jan 4, 2012, at 14:57 , Milan Bouchet-Valat wrote:

Le mercredi 04 janvier 2012 à 08:41 -0500, Dan Abner a écrit :
Hello everyone,

I have the following call to sapply() and error message. Is the most
efficient way to deal with this to make sum(!is.na(x)) a function in a
separate line prior to this call? If not, please advise.

N.Valid=sapply(x,sum(!is.na(x)))
Error in match.fun(FUN) :
'sum(!is.na(x))' is not a function, character or symbol
You can use this:
sapply(x, function(x) sum(!is.na(x)))

But, if you can convert x to a matrix, it would be faster and shorter to
check for NAs beforehand, and use apply():
x <- matrix(c(1, 2, NA, 3, NA, 4), 2)
apply(!is.na(x), 2, sum)

Just for completeness: You might also do

sapply(lapply(x, is.na), sum)

I thought from context that the sum of negation of is.na was what was desired, since the negation operator was used and the name of the results was N.Valid. So consider substituting the existing function, complete.cases in place of is.na:

sapply(lapply(x, complete.cases), sum)

Or use the existing function na.omit with length:

sapply(lapply(x, na.omit), length)


I suspect that the anonymous function approach is more efficient, though (if you really need those extra milliseconds of your life).


--

David Winsemius, MD
West Hartford, CT

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to