On Jan 4, 2012, at 16:32 , David Winsemius wrote: > > 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.
Oops. Yes. > So consider substituting the existing function, complete.cases in place of > is.na: > > sapply(lapply(x, complete.cases), sum) Yes. I suppose Negate(is.na) would just be being silly. Unless x is a list of data frames or something... Picking up on Milan's note, notice that if x is a data frame, then conversion to matrix is automatic and, e.g. > apply(!is.na(airquality), 2, sum) Ozone Solar.R Wind Temp Month Day 116 146 153 153 153 153 works fine. -- Peter Dalgaard, Professor, Center for Statistics, Copenhagen Business School Solbjerg Plads 3, 2000 Frederiksberg, Denmark Phone: (+45)38153501 Email: pd....@cbs.dk Priv: pda...@gmail.com ______________________________________________ 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.