Counts & Percentages in xTable, Sweave, R, Kreuztabellen

Edit: Aufbauend auf der Antwort von aL3xa unten habe ich seine Syntax unten geändert. Nicht perfekt, aber immer näher. Ich habe immer noch keine Möglichkeit gefunden, xtable dazu zu bringen, \ multicolumn {} Argumente für Spalten oder Zeilen zu akzeptieren. Es sieht auch so aus, als ob Hmisc einige dieser Aufgaben hinter den Kulissen erledigt, aber es sieht ein bisschen nach einem Unterfangen aus, zu verstehen, was dort vor sich geht. Hat jemand Erfahrung mit der Latexfunktion in 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)
}

Ich möchte eine für die LaTeX-Ausgabe formatierte Tabelle erstellen, die sowohl die Anzahl als auch die Prozentsätze für jede Spalte oder Variable enthält. Ich habe keine fertige Lösung für dieses Problem gefunden, habe aber das Gefühl, dass ich das Rad in gewissem Maße neu erstellen muss.

Ich habe eine Lösung für einfache Tabellierungen entwickelt, habe aber Probleme damit, etwas für eine Kreuztabellierung zu übernehmen.

Zunächst einige Beispieldaten:

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

Und jetzt die Funktion für gerade Tabs:

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

Hat jemand Vorschläge, dies für Kreuztabellen zu übernehmen (d. H. Wochentag NACH Reisezweck)? Hier ist, was ich gerade geschrieben habe, das NICHT die xtable-Bibliothek verwendet und FAST funktioniert, aber nicht dynamisch ist und ziemlich hässlich ist, damit zu arbeiten:

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

Antworten auf die Frage(14)

Ihre Antwort auf die Frage