[R] NAs and row/column calculations

Petr PIKAL petr.pikal at precheza.cz
Fri Mar 12 14:55:27 CET 2010


Hi

r-help-bounces at r-project.org napsal dne 12.03.2010 00:20:39:

> 
> > 
> > On 12/03/2010, at 11:25 AM, Jim Bouldin wrote:
> > 
> > > 
> > > I continue to have great frustrations with NA values--in particular
> > making
> > > summary calculations on rows or cols of a matrix containing them. 
For
> > > example, why does:
> > > 
> > >> a = matrix(1:30,nrow=5)
> > >> is.na(a[c(1:2),c(3:4)]);a
> > >     [,1] [,2] [,3] [,4] [,5] [,6]
> > > [1,]    1    6   NA   NA   21   26
> > > [2,]    2    7   NA   NA   22   27
> > > [3,]    3    8   13   18   23   28
> > > [4,]    4    9   14   19   24   29
> > > [5,]    5   10   15   20   25   30
> > >> apply(a[!is.na(a)],2,sum)
> > > 
> > > give me this:
> > > 
> > > "Error in apply(a[!is.na(a)], 2, sum) : dim(X) must have a positive
> > length"
> > > 
> > > when
> > > 
> > >> dim(a)
> > > [1] 5 6
> > > 
> > > What is the trick to calculating summary values from rows or columns
> > > containing NAs?  Drives me nuts.  More nuts that is.
> > 
> > When you do a[!is.na(a)] you get a ***vector*** --- not a matrix.
> > ``Obviously''!!! 
> 
> Well, obvious to you maybe, or someone who's done it before, but not to 
me.

You can consider matrix as a vector with dimensions. When you extract few 
values, dimensions are lost as they do not have a reasonable meaning in 
new object.

mat<-matrix(1:12, 3,4)
> mat
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
mat[-c(5,7)] 
 [1]  1  2  3  4  6  8  9 10 11 12

> 
> The non-missing values of a cannot be arranged in
> > a 5 x 6 matrix; there are only 26 of them.  So (as my late Uncle
> > Stanley would have said) ``What the hell do you expect?''.
> 
> Silly me, I expected, based on (1) previous experience doing summary 
calcs
> on subsets of a matrix using exactly that style of command, and (2) the
> fact that dim(a) returns: [1] 5 6, and (3) the fact that a help search
> under the "apply" function gives NO INDICATION of any possible use of 
the
> na.rm command, AND (4) a help search on "na.action" does not even 
mention
> na.rm, that:
> 
> > apply(a[!is.na(a)],2,sum)
> 
> would sum the non-NA elements of matrix a, by columns.  Terribly faulty
> reasoning on my part, obviously.

The core of *apply function is that it applies any FUN function to an 
object in some particular way. How the FUN function behaves and what 
results you get is entirely on this FUN function. So whenever you get 
unexpected result with *apply family you shall first check help for used 
FUN function

Usage:

     sum(..., na.rm = FALSE)
 
Regards
Petr




> 
> 
> > 
> > The ``trick'' is to remove the NAs at the summing stage:
> > 
> > apply(a,2,sum,na.rm=TRUE)
> > 
> > Not all that tricky.
> > 
> >    cheers,
> > 
> >       Rolf Turner
> > 
> > ######################################################################
> > Attention: 
> > This e-mail message is privileged and confidential. If you are not the 

> > intended recipient please delete the message and notify the sender. 
> > Any views or opinions presented are solely those of the author.
> > 
> > This e-mail has been scanned and cleared by MailMarshal 
> > www.marshalsoftware.com
> > ######################################################################
> > 
> 
> Jim Bouldin, PhD
> Research Ecologist
> Department of Plant Sciences, UC Davis
> Davis CA, 95616
> 530-554-1740
> 
> ______________________________________________
> R-help at 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.



More information about the R-help mailing list