Recuentos y porcentajes en xTable, Sweave, R, tabulaciones cruzadas

Editar: Partiendo de la respuesta de aL3xa a continuación, he modificado su sintaxis a continuación. No es perfecto, pero cada vez más cerca. Todavía no he encontrado una manera de hacer que xtable acepte argumentos de \ multicolumn {} para columnas o filas. También parece que Hmisc maneja algunos de estos tipos de tareas detrás de escena, pero parece un poco difícil entender lo que está sucediendo allí. ¿Alguien tiene experiencia con la función de látex en 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)
}

Me gustaría crear una tabla formateada para la salida de LaTeX que contenga tanto los recuentos como los porcentajes para cada columna o variable. No he encontrado una solución preparada para este problema, pero siento que debo estar recreando la rueda hasta cierto punto.

He desarrollado una solución para tabulaciones rectas, pero estoy luchando por adoptar algo para una tabulación cruzada.

Primero algunos datos de muestra:

#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"))

Y ahora la función de pestaña recta de trabajo:

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")

¿Alguien tiene alguna sugerencia para adoptar esto para tabulaciones cruzadas (es decir, día de la semana POR propósito del viaje)? Esto es lo que he escrito actualmente, que NO usa la biblioteca xtable y casi funciona, pero no es dinámico y es bastante feo para trabajar:

#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")

Respuestas a la pregunta(7)

Su respuesta a la pregunta