[R] Handling NA values

Marc Schwartz marc_schwartz at me.com
Sat Feb 16 19:47:58 CET 2013


Nothing comes to mind immediately for rowSums() or colSums() given the way in which they handle things, however using apply() you have more flexibility, albeit at the price of some speed:

> apply(Mat, 1, function(x) if (all(is.na(x))) NA else sum(x, na.rm = TRUE))
[1]  0  3 NA

Essentially, if all elements in the row are NA's return NA otherwise return the sum of the non-NA elements.

Change the margin from 1 to 2 in apply() to use the same approach on columns.

Regards,

Marc

On Feb 16, 2013, at 12:22 PM, Christofer Bogaso <bogaso.christofer at gmail.com> wrote:

> Thanks Marc for your reply.
> 
> However this leads to my problem of handling rowSums() function (hence
> colSums()). Let take following matrix:
> 
>> Mat <- matrix(c(1, 1, NA, -1, 1, NA, NA, 1, NA), nc = 3)
>> Mat
>     [,1] [,2] [,3]
> [1,]    1   -1   NA
> [2,]    1    1    1
> [3,]   NA   NA   NA
>> rowSums(Mat, na.rm = TRUE)
> [1] 0 3 0
> 
> I want to have some way to distinguish the 1st '0' and the 3rd '0'. I
> want to see NA directly for the 3rd. Any possibility how to do that
> through the rowSum() function?
> 
> Thanks and regards,
> 
> 
> 
> On Sat, Feb 16, 2013 at 11:52 PM, Marc Schwartz <marc_schwartz at me.com> wrote:
>> 
>> On Feb 16, 2013, at 11:55 AM, Christofer Bogaso <bogaso.christofer at gmail.com> wrote:
>> 
>>> Hello again,
>>> 
>>> I have a question on who sum() handle the NA values.
>>> 
>>>> sum(c(NA, 1), na.rm = TRUE)
>>> [1] 1
>>> 
>>> 
>>> I understand this. However could not agree with following:
>>> 
>>>> sum(c(NA, NA), na.rm = TRUE)
>>> [1] 0
>>> 
>>> 
>>> Where this '0' is coming from? Should not it be NA itself?
>>> 
>>> Thanks and regards,
>> 
>> 
>> 
>> The result of:
>> 
>>  sum(c(NA, NA), na.rm = TRUE)
>> 
>> is to sum an empty set, hence the 0.
>> 
>> 
>>> na.omit(c(NA, NA))
>> logical(0)
>> attr(,"na.action")
>> [1] 1 2
>> attr(,"class")
>> [1] "omit"
>> 
>> 
>>> sum(logical(0))
>> [1] 0
>> 
>> 
>> If you retained the NA's, then the result is undefined:
>> 
>>> sum(c(NA, NA))
>> [1] NA
>> 
>> 
>> See:
>> 
>>  http://rwiki.sciviews.org/doku.php?id=tips:surprises:emptysetfuncs
>> 
>> for more information.
>> 
>> Regards,
>> 
>> Marc Schwartz



More information about the R-help mailing list