Hi r-help-boun...@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@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. ______________________________________________ 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.