I agree with the comment that ddply(thetas,.(model,rho_cnd,pct_cnd),...)
should work. If certain combinations of those variables don't show up, ddply(..., .drop=TRUE) will ensure that the unobserved combinations don't show up.
However, if you wanted to avoid ddply looking through some of the non-existant combinations, you could try something like the following:
#newCond <- apply(thetas[,c("model", "rho_cnd", "pct_cnd")], 1, paste, collapse="_")
newCond <- do.call(paste, thetas[,c("model", "rho_cnd", "pct_cnd")], sep="_") #as suggested by baptiste
thetas2 <- cbind(thetas, newCond)
I admit, the above code might run slowly for you, so I'm not sure it's what you want. But from there you should be able to use ddply() with .variables=newCond.
Furthermore, because you're returning only a single number for each subset of the data, you could just use aggregate, if you wanted.
sums <- aggregate(thetas2[,"estError"], by=thetas2[,"newCond"], colSums)
I hope this helps.