[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