Isso pode ser feito de muitas formas, via muitos pacotes e funções. Dentre tantas, uma possibilidade seria essa. Certamente não é a melhor mas serve.

str(GPD)

xtabs(~TRAT+ANIMAL, data=GPD)
xtabs(~DATA+ANIMAL, data=GPD)

require(reshape)
require(plyr)

db <- cast(data=GPD, ANIMAL~DATA, value="Pesos")

db$mGPD <- apply(db[,-1], MARGIN=1,
                 function(x){
                     mean(diff(na.omit(x)))
                 })

À disposição.
Walmes.