avg.surv <- function(cfit, var.name, var.values, data, weights)
{
	if(missing(data)) {
		if(!is.null(cfit$model))
			mframe <- cfit$model
		else mframe <- model.frame(cfit, sys.parent())
	}   else mframe <- model.frame(cfit, data)
	var.num <- match(var.name, names(mframe))
	data.patterns <- apply(data.matrix(mframe[,  - c(1, var.num)]), 1, 
		paste, collapse = ",")
        data.patterns <- factor(data.patterns,levels=unique(data.patterns))
	if(missing(weights))
		weights <- table(data.patterns)
	else weights <- tapply(weights, data.patterns, sum)
        kp <- !duplicated(data.patterns)
	mframe <- mframe[kp,]
        obs.var <- mframe[,var.num]
        lps <- (cfit$linear.predictor)[kp]
        tframe <- mframe[rep(1,length(var.values)),]
        tframe[,var.num] <- var.values
        xmat <- model.matrix(cfit,data=tframe)[,-1]
        tlps <- as.vector(xmat%*%cfit$coef)
        names(tlps) <- var.values
        obs.off <- tlps[as.character(obs.var)] 
        explp.off <- exp(outer(lps - obs.off ,tlps,"+"))
	bfit <- survfit.coxph(cfit, se.fit = F)
        fits <- outer(bfit$surv,explp.off,function(x,y) x^y)
        avg.fits <- 
           apply(sweep(fits,2,weights,"*"),c(1,3),sum)/sum(weights)
        dimnames(avg.fits) <- list(NULL,var.values)
        list(time=bfit$time,fits=avg.fits)
}