A aggregate() retorna resultado com colunas com nomes corretos se passar via fórmula. Além dela, a plyr::ddply() é uma função muito interessante para operações desse tipo. Segue exemplo das duas no CMR.

res <- aggregate(cbind(acidezKOH, acidezOLEIC)~Trat+Tipo+Tempo, data=d1, FUN=mean)

require(plyr)

colwise(mean, is.numeric)(d1)
colwise(mean, ~acidezKOH+acidezOLEIC)(d1)

ddply(d1, .(Trat, Tipo, Tempo), .fun=colwise(mean, is.numeric))
ddply(d1, .(Trat, Tipo, Tempo), .fun=colwise(mean, ~acidezKOH+acidezOLEIC))

​À
​ disposição.
Walmes.​