2010-04-02 4 views
4

Si vous avez 2 variables de classification croisée, vous pouvez utiliser rowSums et colSums pour générer des totaux de marge sur une sortie xtabs. Mais comment cela peut-il être fait si vous avez 3 variables de classification (c'est-à-dire des totaux de marge dans chaque sous-table)?Totaux de marge dans les xtabs

Répondre

5

Aniko a mentionné dans un commentaire, mais il n'a jamais été fourni en réponse.

Je l'ai trouvé de façon indépendante, puis j'ai remarqué que c'était dans un commentaire, donc je remercie Aniko d'avoir été la première à le faire.

addmargins est la réponse:

Pour une table donnée, on peut spécifier quels des facteurs de classification à augmenter de un ou plusieurs niveaux pour maintenir les marges à calculer. On peut par exemple former des sommes et des moyennes sur la première dimension et des médianes sur la seconde. La table résultante aura alors deux niveaux supplémentaires pour la première dimension et un niveau supplémentaire pour la seconde. Le par défaut est de totaliser toutes les marges de la table. Les autres possibilités peuvent donner des résultats qui dépendent de l'ordre dans lequel les marges sont calculées. Ceci est marqué dans la sortie imprimée de la fonction.

2

(si je comprends bien) Vous pouvez utiliser ddply:

ff <- data.frame(f1=c("a", "b", "b", "b", "b", "b", "b"), f2=c("p", "p", "p", "q", "q", "q", "q"), f3=c("x","x","x","x","y", "y", "y"), val=c(1:7)) 

ddply(ff, .(f1), numcolwise(sum)) 
ddply(ff, .(f2), numcolwise(sum)) 
ddply(ff, .(f3), numcolwise(sum)) 
4

L'approche générale est d'utiliser la fonction apply, mais spécifiquement pour les totaux de la fonction margin.table peut être plus pratique:

#create 3 factors 
a <- gl(2,4, length=20) 
b <- gl(3,2, length=20) 
d <- gl(4,2, length=20) 
# table 
tt <- xtabs(~a+b+d) 

# marginal sums 
margin.table(tt, 1) 
apply(tt, 1, sum) #same answer 

#multi-way margins 
margin.table(tt, 1:2) 
apply(tt, 1:2, sum) #same answer 
0

Les commentaires ne fonctionnent pas ci-dessus. Merci pour les réponses, mais ils n'ont pas fait ce que j'attendais - des totaux individuels dans chaque sous-groupe. Après un peu d'exploration, j'ai trouvé que la sortie xtabs dans ce cas est un tableau à trois dimensions, et a écrit la fonction suivante pour obtenir le résultat souhaité (notez qu'il est incomplet, mais fonctionne pour les totaux de colonne jusqu'à présent):

xtabTotals <- function(tabs,margin=1) 
# takes a 3 dimensional xtabs array and performs margin total on each sub table 
# only doing column margins so far 
{ 
    out <- array(0,dim(tabs)+c(1,0,0)) 
    dnout <- dimnames(tabs) 
    dnout[[1]] <- c(dnout[[1]],"Total") 
    dimnames(out) <- dnout 

    for (i in 1:dim(tabs)[3]) 
    { 
     out[,,i] <- rbind(tabs[,,i],colSums(tabs[,,i])) 
    } 
    out 
} 
+7

Je n'ai clairement pas compris ce que vous vouliez, et je ne regarde même pas votre fonction. Peut-être cherchez-vous 'addmargins'? – Aniko

+0

Oui c'est exactement ce que je veux, merci! – James

4

Si vous n'êtes pas lié à xtabs, le paquet Deducer a des fonctions très pratiques pour les tables d'urgence:

> a <- gl(2,4, length=20) 
> b <- gl(3,2, length=20) 
> d <- rnorm(20)>0 
> dat <- data.frame(a,b,d) 
> tables<-contingency.tables(
+ row.vars=a, 
+ col.vars=b, 
+ stratum.var=d,data=dat) 
> tables 
================================================================================ 

       ==================================================    
         ========== Table: a by b ==========      

         | -- Stratum = FALSE -- 
         | b 
        a |  1 |  2 |  3 | Row Total | 
-----------------------|-----------|-----------|-----------|-----------| 
      1 Count |  2 |  2 |  1 |  5 | 
       Row % | 40.000% | 40.000% | 20.000% | 55.556% | 
       Column % | 40.000% | 100.000% | 50.000% |   | 
       Total % | 22.222% | 22.222% | 11.111% |   | 
-----------------------|-----------|-----------|-----------|-----------| 
      2 Count |  3 |  0 |  1 |  4 | 
       Row % | 75.000% | 0.000% | 25.000% | 44.444% | 
       Column % | 60.000% | 0.000% | 50.000% |   | 
       Total % | 33.333% | 0.000% | 11.111% |   | 
-----------------------|-----------|-----------|-----------|-----------| 
      Column Total |  5 |  2 |  2 |  9 | 
       Column % | 55.556% | 22.222% | 22.222% |   | 

         | -- Stratum = TRUE -- 
         | b 
        a |  1 |  2 |  3 | Row Total | 
-----------------------|-----------|-----------|-----------|-----------| 
      1 Count |  2 |  2 |  3 |  7 | 
       Row % | 28.571% | 28.571% | 42.857% | 63.636% | 
       Column % | 66.667% | 50.000% | 75.000% |   | 
       Total % | 18.182% | 18.182% | 27.273% |   | 
-----------------------|-----------|-----------|-----------|-----------| 
      2 Count |  1 |  2 |  1 |  4 | 
       Row % | 25.000% | 50.000% | 25.000% | 36.364% | 
       Column % | 33.333% | 50.000% | 25.000% |   | 
       Total % | 9.091% | 18.182% | 9.091% |   | 
-----------------------|-----------|-----------|-----------|-----------| 
      Column Total |  3 |  4 |  4 |  11 | 
       Column % | 27.273% | 36.364% | 36.364% |   | 


================================================================================