Uma for mais simples, sem chamar o reshape e na linha do que você estava imaginando, seria

require(plyr)

## Ordenar para assegurar ordem cronológica.
da <- arrange(GPD, ANIMAL, DATA)
str(da)

f <- function(x){
    mean(diff(na.omit(x)))
}

ddply(da, .(ANIMAL), summarise, mGPD=f(Pesos))

À disposição.
Walmes.