[R] Simple loop

Petr Savicky savicky at praha1.ff.cuni.cz
Wed May 4 19:21:11 CEST 2011


On Wed, May 04, 2011 at 08:52:07AM -0700, William Dunlap wrote:
> > -----Original Message-----
> > From: r-help-bounces at r-project.org 
> > [mailto:r-help-bounces at r-project.org] On Behalf Of Petr Savicky
> > Sent: Wednesday, May 04, 2011 12:51 AM
> > To: r-help at 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).

I agree. For the original question, avoiding the warning is
preferrable. The general question belongs more to R-devel.

> 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.

Thank you for this remark. I used the formulation "combine
... in any way suitable for the application" with this effect in
mind, but let us be more specific. For numbers, in particular
integers, paste() seems to be good enough. For character vectors,
a possible approach is

  paste(X, Y, sep="\r")

since the character "\r" is unlikely to be used in character
vectors. A similar approach is used, for example in unique.matrix().
I did not like it much, but it also has advantages.

Petr Savicky.



More information about the R-help mailing list