Skip to content

Help to count in apply(...)

7 messages · gianni lavaredo, Robert J. Hijmans, Hadley Wickham

#
Dear Gianni,

I think you want this:

tapply(areaFe$K <= fer.conc.max, areaFe$ID, sum, na.rm=TRUE)

E.g.:

ID <- rep(1:10, each=10)
K <- runif(100)
areaFe <- as.data.frame(cbind(ID, K))
fer.conc.max <- 0.5
tapply(areaFe$K <= fer.conc.max, areaFe$ID, sum, na.rm=TRUE)


Robert


On Fri, Mar 13, 2009 at 9:58 AM, gianni lavaredo
<gianni.lavaredo at gmail.com> wrote:
#
I see, I did not understand that. This is a quick fix, please check if
it is OK. Using which.max might be more elegant.

ID <- rep(1:10, each=10)
K <- runif(100)
areaFe <- as.data.frame(cbind(ID, K))
fer.conc.max <- tapply(areaFe$K, areaFe$ID, max, na.rm=TRUE)
fermax <- rep (fer.conc.max, each=10)
tapply(areaFe$K > 0.9 * fermax, areaFe$ID, sum, na.rm=TRUE)

Robert

On Fri, Mar 13, 2009 at 5:02 PM, gianni lavaredo
<gianni.lavaredo at gmail.com> wrote:
#
I think the solution is using 'merge'

soil.fe <- data.frame(
  ID =c(1,1,1,1,2,2,3,3,4,5,5,5,5,5,9,9,9,9,9,9,10,10),
  K =c(6.25,12.50,25.00,50.00,80.00,12.00,6.25,12.50,25.00,50.00,76.00,67.00,67.00,56.00,98.00,32.00,33.00,43.00,54.00,76.00,85.00,67.00))

 fer.conc.max <- tapply(soil.fe$K, soil.fe$ID, max, na.rm=TRUE)
 fm <- matrix(as.numeric(cbind(names(fer.conc.max), fer.conc.max)), ncol=2)
 colnames(fm) <- c('ID', 'maxFe')
 merge(soil.fe, fm)

 R

On Fri, Mar 13, 2009 at 8:29 PM, gianni lavaredo
<gianni.lavaredo at gmail.com> wrote:
#
On Fri, Mar 13, 2009 at 7:55 AM, Robert Hijmans <r.hijmans at gmail.com> wrote:
Another alternative is to use ddply from the plyr package:

ddply(soil.fe, .(ID), transform, maxFe = max(K, na.rm = T))

You can find out more at http://had.co.nz/plyr.

Hadley