You can also automate it with this: do.multirow<-function(df, which=1:ncol(df)){ for(c in which){ runs <- rle(as.character(df[,c])) if(all(runs$lengths>1)){ tmp <- rep("", nrow(df)) tmp[c(1, 1+head(cumsum(runs$lengths),-1))] <- paste("\\multirow{",runs$lengths,"}{*}{",df[c(1, 1+head(cumsum(runs$lengths),-1)),c],"}",sep="") df[,c] <- tmp } } return(df) } This will replace the "which"-columns of data.frame "df" that have only repeated entries in the "which"-columns of data.frame "df" with the appropriate \multirow commands. You then have to use print.xtable with sth like print(xtable(do.multirow(df)), sanitize.text.function = function(x){ return(x) } ) [[alternative HTML version deleted]]
You can also automate it with this: do.multirow<-function(df, which=1:ncol(df)){ ??? for(c in which){ ??? ??? runs <- rle(as.character(df[,c])) ??? ??? if(all(runs$lengths>1)){ ??? ??? ??? tmp <- rep("", nrow(df)) ??? ??? ??? tmp[c(1, 1+head(cumsum(runs$lengths),- 1))] <- ??? ??? ??? ??? ??? paste("\\multirow{",runs$lengths,"}{*}{",df[c(1, 1+head(cumsum(runs$lengths),-1)),c],"}",sep="") ??? ??? ??? df[,c] <- tmp ??? ??? } ??? } ??? return(df) } This will replace the "which"-columns of data.frame "df" that have only repeated entries with the appropriate \multirow commands. You then have to use print.xtable with sth like print(xtable(do.multirow(df)), ??? ??? sanitize.text.function = function(x){ ??? ??? ??? return(x) ??? ??? } )