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
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.
(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))
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
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
}
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% | |
================================================================================
- 1. mois totaux sages dans les colonnes
- 2. sql pour calculer les totaux quotidiens minimise les totaux du jour précédent
- 3. Rembourrage de marge de menu CSS/marge
- 4. Comment calculer les totaux avec smarty php
- 5. Sous-totaux de recherche MySQL
- 6. IE7 & IE8 Problèmes de marge/marge
- 7. problème de marge dans l'opéra
- 8. Marge de droite dans Vim
- 9. Mise à jour des sous-totaux dans les fichiers Excel
- 10. Comment éviter d'utiliser les totaux cumulés dans mon code?
- 11. marge étrange dans IE6
- 12. Marques de marge droite dans les éditeurs de texte VS2010
- 13. Affichage des totaux dans le ListView LayoutTemplate
- 14. Calcul des sous-totaux dans R
- 15. totaux multiples sur sql
- 16. Besoin d'une colonne Totaux dans MDX
- 17. Excel VBA: Les valeurs Distinct de sortie et sous-totaux
- 18. totaux Regroupement par plages de dates
- 19. totaux des colonnes de la table displaytag
- 20. problème de marge css
- 21. Requêtes SQL Server Totaux mensuels
- 22. marge effondrement
- 23. Problème de marge/marge de remplissage CSS dans le navigateur Zoom
- 24. Running SQL Audit Log Totaux
- 25. , marge supplémentaire
- 26. Marge différente pour les navigateurs Webkit
- 27. Affichage de totaux multiples dans une table à partir d'Oracle
- 28. Afficher les totaux dans une plage de dates spécifiée dans Microsoft Access
- 29. Sqlite: Sélection des enregistrements répartis sur les enregistrements totaux
- 30. SQL Server exécution de plusieurs Totaux
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
Oui c'est exactement ce que je veux, merci! – James