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.