Contagens e porcentagens em xTable, Sweave, R, tabulações cruzadas

Edit: Com base na resposta de aL3xa abaixo, modifiquei sua sintaxe abaixo. Não é perfeito, mas está chegando mais perto. Ainda não encontrei uma maneira de fazer com que os argumentos do xtable accept \ multicolumn {} para colunas ou linhas. Parece também que o Hmisc lida com alguns desses tipos de tarefas nos bastidores, mas parece um pouco difícil entender o que está acontecendo lá. Alguém tem experiência com a função de látex no Hmisc?

ctab <- function(tab, dec = 2, margin = NULL) {
    tab <- as.table(tab)
    ptab <- paste(round(prop.table(tab, margin = margin) * 100, dec), "%", sep = "")
    res <- matrix(NA, nrow = nrow(tab) , ncol = ncol(tab) * 2, byrow = TRUE)
    oddc <- 1:ncol(tab) %% 2 == 1
    evenc <- 1:ncol(tab) %% 2 == 0
    res[,oddc ] <- tab
    res[,evenc ] <- ptab
    res <- as.table(res)
    colnames(res) <- rep(colnames(tab), each = 2)
    rownames(res) <- rownames(tab)
    return(res)
}

Gostaria de criar uma tabela formatada para a saída LaTeX que contenha as contagens e porcentagens para cada coluna ou variável. Não encontrei uma solução pronta para esse problema, mas sinto que devo estar recriando a roda até certo ponto.

Eu desenvolvi uma solução para tabulações diretas, mas estou lutando para adotar algo para uma tabulação cruzada.

Primeiro, alguns dados de amostra:

#Generate sample data
dow <- sample(1:7, 100, replace=TRUE)
purp <- sample(1:4, 100, replace=TRUE)
dow <- factor(dow, 1:7, c("Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun"))
purp <- factor(purp, 1:4, c("Business", "Commute", "Vacation", "Other"))

E agora a função de aba reta de trabalho:

customTable <- function(var, capt = NULL){
    counts <- table(var)
    percs <- 100 * prop.table(counts)       

    print(
        xtable(
            cbind(
                Count = counts
                , Percent = percs
            )
        , caption = capt
        , digits = c(0,0,2)
        )
    , caption.placement="top"
    )
}

#Usage
customTable(dow, capt="Day of Week")
customTable(purp, capt="Trip Pupose")

Alguém tem alguma sugestão para adotar isso para tabulações cruzadas (ou seja, dia da semana por finalidade de viagem)? Aqui está o que eu escrevi atualmente, que NÃO usa a biblioteca xtable e QUASE funciona, mas não é dinâmico e é bastante feio para trabalhar:

#Create table and percentages
a <- table(dow, purp)
b <- round(prop.table(a, 1),2)

#Column bind all of the counts & percentages together, this SHOULD become dynamic in future
d <- cbind( cbind(Count = a[,1],Percent =  b[,1])
        , cbind(Count = a[,2], Percent = b[,2])
        , cbind(Count = a[,3], Percent = b[,3])
        , cbind(Count = a[,4], Percent = b[,4])
)

#Ugly function that needs help, or scrapped for something else
crossTab <- function(title){
    cat("\\begin{table}[ht]\n")
    cat("\\begin{center}\n")
    cat("\\caption{", title, "}\n", sep="") 

    cat("\\begin{tabular}{rllllllll}\n")
    cat("\\hline\n")

    cat("", cat("", paste("&\\multicolumn{2}{c}{",colnames(a), "}"), sep = ""), "\\\\\n", sep="")
    c("&", cat("", colnames(d), "\\\\\n", sep=" & "))
    cat("\\hline\n")
    c("&", write.table(d, sep = " & ", eol="\\\\\n", quote=FALSE, col.names=FALSE))

    cat("\\hline\n")
    cat("\\end{tabular}\n")
    cat("\\end{center}\n")
    cat("\\end{table}\n")   
}   

crossTab(title = "Day of week BY Trip Purpose")

questionAnswers(7)

yourAnswerToTheQuestion