[R] Simple loop
Petr Savicky
savicky at praha1.ff.cuni.cz
Wed May 4 09:50:59 CEST 2011
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().
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.
More information about the R-help
mailing list