2016-11-11 2 views
0

Je souhaite générer une table croisée avec la colonne totale pour la ligne et la colonne. J'ai essayé de générer le fichier crosstable en utilisant le module gmodels. L'apparence de la sortie est meilleure que la fonction de table normale. L'apparence de la table est importante car finalement elle doit être affichée en utilisant Shiny. Mais le problème est que j'obtiens le total de la colonne et le total des lignes à la fin des lignes et des colonnes. Comment puis-je obtenir la colonne totale comme la première colonne et la rangée dans le tableau.Brillant - Génère un tableau croisé avec le total de colonne et le total de ligne comme première ligne/colonne

Voici l'exemple de mes données.

Location <- sample(c("location A","location B","location C","location D","location E"),20,replace = T) 
Brand <- sample(c("Brand A","Brand B","Brand C"),20,replace = T) 
Year <- rep(c("Year 2014","Year 2015"),10) 
Q1 <- sample(1:5,20,replace = T) 
Q2 <- sample(1:5,20,replace = T) 

mydata <- as.data.table(cbind(Location,Brand,Year,Q1,Q2)) 

Les données sont énormes et, par conséquent, elles sont données.table.

code

que j'utilise pour générer la table croix est -

library("gmodels") 

mydata[,CrossTable(Location,Brand,prop.c = T,prop.r = F,prop.t = F,prop.chisq = F,chisq = F,format = "SPSS")] 

Cela donne à la sortie, mais les colonnes totales est à la fin de la ligne et à la fin de la colonne. La colonne% est également manquante pour la colonne totale. Comment puis-je avoir les colonnes totales comme la première ligne et la colonne et avoir le% pour cela?

Suggérer une sortie.

+0

Vous ne voulez probablement pas 'cbind' ici. Regardez 'str (mydata)' et notez que tous les cols ont été forcés dans des chaînes/caractères. Peut-être que vous voulez 'reshape2 :: dcast (mydata, Location ~ Brand, marges = TRUE)' ici? – Frank

+0

Puisque 'CrossTable' renvoie null alors votre seule option est de modifier sa source selon vos besoins. –

Répondre

0

Avez-vous essayez d'utiliser package sjPlot .... il a une très bonne fonction, sjt.xtab qui génère des tableaux croisés (tableaux d'urgence) similaires à ce que vous recherchez. Il a beaucoup d'options à explorer. J'ai utilisé peu d'entre eux ci-dessous. Vous pouvez regarder? Sjt.xtab et voir d'autres options disponibles. Le code ci-dessous génère une sortie de table avec des pourcentages de colonne et a une colonne et des lignes totales.

sjt.xtab(mydata$Location, mydata$Brand, 
     show.col.prc = T, 
     show.summary = F, 
     show.na = F, 
     wrap.labels = 50, 
     tdcol.col = "#f90470", 
     emph.total = T, 
     emph.color = "#3aaee5", 
     use.viewer = T, 
     CSS = list(css.table = "border: 1px solid;", 
        css.tdata = "border: 1px solid;")) 
+0

J'avais trouvé sur le paquet sjPlot et l'ai utilisé dans ce cas. Oui, c'est tout à fait utile et répond à l'exigence seule chose ne donne pas le total en 1ère ligne et 1ère colonne. Mais encore mieux que les autres sorties de table. J'ai manqué de poster la réponse et je vous remercie de l'avoir posté. – user1412

0

Peut-être que quelque chose comme ça pourrait faire?

myCT <- function(mydata) { 
    mydata_ct_n <- dcast.data.table(mydata, Location ~ Brand, margins = T) 
    mydata_ct_n[, all := rowSums(.SD), by = Location] 
    mydata_ct_n <- rbind(mydata_ct_n[, lapply(.SD, sum), .SDcols = 2:ncol(mydata_ct_n)], mydata_ct_n, fill = T) 
    mydata_ct_n$Location[1] <- "all" 
    foocols <- c("all", "Location") 
    setcolorder(mydata_ct_n, c(foocols, setdiff(colnames(mydata_ct_n), foocols))) 

    mydata_ct_p <- copy(mydata_ct_n) 
    for (j in 3:ncol(mydata_ct_p)) { 
    set(mydata_ct_p, j = j, value = as.numeric(mydata_ct_p[[j]])) 
    set(mydata_ct_p, i = 2:nrow(mydata_ct_p), j = j, value = round(100 * mydata_ct_p[2:nrow(mydata_ct_p), j, with = F]/mydata_ct_p[[j]][1], 0)) 
    } 
    set(mydata_ct_p, 1L, 3L:ncol(mydata_ct_p), round(100 * mydata_ct_p[1L, 3L:ncol(mydata_ct_p), with = F]/mydata_ct_p[["all"]][1], 0)) 

    for (j in 3:ncol(mydata_ct_p)) { 
    set(mydata_ct_p, j = j, value = as.character(mydata_ct_p[[j]])) 
    set(mydata_ct_n, j = j, value = as.character(mydata_ct_n[[j]])) 
    set(mydata_ct_p, j = j, 
     value = paste0(mydata_ct_p[[j]], "% (", mydata_ct_n[[j]], ")")) 
    } 
    return(mydata_ct_p) 
} 

Location <- sample(c("location A","location B","location C","location D","location E"),20,replace = T) 
Brand <- sample(c("Brand A","Brand B","Brand C"),20,replace = T) 
Year <- rep(c("Year 2014","Year 2015"),10) 
Q1 <- sample(1:5,20,replace = T) 
Q2 <- sample(1:5,20,replace = T) 
mydata <- as.data.table(cbind(Location,Brand,Year,Q1,Q2)) 

out <- myCT(mydata) 
print(out) 
# all Location Brand A Brand B Brand C 
# 1: 20  all 30% (6) 35% (7) 35% (7) 
# 2: 3 location A 0% (0) 43% (3) 0% (0) 
# 3: 5 location B 33% (2) 14% (1) 29% (2) 
# 4: 5 location C 50% (3) 0% (0) 29% (2) 
# 5: 4 location D 17% (1) 29% (2) 14% (1) 
# 6: 3 location E 0% (0) 14% (1) 29% (2) 
+0

C'est assez intéressant. Cependant, j'ai besoin de générer de telles sorties de tableau croisé pour un certain nombre de variables et ce serait environ 40-50 de ces sorties. Ce serait un long code à répliquer et donc cherchait un package OU une solution dans le package gmodels. – user1412

+0

pas si vous en faites une fonction;), laissez-moi modifier :) –

+0

comme mentionné voulait générer dans Shiny. le code ne génère pas la sortie nécessaire dans Shiny – user1412