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.