[R] Using a mathematical expression in sapply() XXXX
David Winsemius
dwinsemius at comcast.net
Wed Jan 4 16:32:58 CET 2012
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
More information about the R-help
mailing list