> -----Original Message----- > From: r-help-boun...@r-project.org > [mailto:r-help-boun...@r-project.org] On Behalf Of Petr Savicky > Sent: Wednesday, May 04, 2011 12:51 AM > To: r-help@r-project.org > Subject: Re: [R] Simple loop > > On Tue, May 03, 2011 at 12:04:47PM -0700, William Dunlap wrote: > [...] > > ave() can deal that problem: > > > cbind(x, newCol2 = with(x, ave(H, Site, Prof, > > FUN=function(y)y-min(y)))) > > Site Prof H newCol2 > > 1 1 1 24 8 > > 2 1 1 16 0 > > 3 1 1 67 51 > > 4 1 2 23 0 > > 5 1 2 56 33 > > 6 1 2 45 22 > > 7 2 1 67 21 > > 8 2 1 46 0 > > Warning message: > > In min(y) : no non-missing arguments to min; returning Inf > > The warning is unfortunate: ave() calls FUN even for when > > there is no data for a particular group (Site=2, Prof=2 in this > > case). > > The warning may be avoided using min(y, Inf) instead of min().
Yes, but the fact remains that ave() wastes time and causes unnecessary warnings and errors by calling FUN when it knows it will do nothing with the result (because there are no entries in x with a given combination of the factor levels in the ... arguments). Using paste(Site,Prof) when calling ave() is ugly, in that it forces you to consider implementation details that you expect ave() to take care of (how does paste convert various types to strings?). It also courts errors since paste("A B", "C") and paste("A", "B C") give the same result but represent different Site/Prof combinations. Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com > > cbind(x, newCol2 = with(x, ave(H, Site, Prof, > FUN=function(y)y-min(y,Inf)))) > > Site Prof H newCol2 > 1 1 1 24 8 > 2 1 1 16 0 > 3 1 1 67 51 > 4 1 2 23 0 > 5 1 2 56 33 > 6 1 2 45 22 > 7 2 1 67 21 > 8 2 1 46 0 > > Another approach is to combine Site, Prof to a single column > in any way suitable for the application. For example > > cbind(x, newCol2 = with(x, ave(H, paste(Site, Prof), > FUN=function(y)y-min(y)))) > > Petr Savicky. > > ______________________________________________ > 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.