Si vous avez 2 variables de classification croisées, vous pouvez utiliser rowsums code> et
colsums code> pour produire des totaux de marge sur une sortie
xtabs code>. Mais comment peut-il être fait si vous avez 3 variables de classement (c.-à-d. Totaux de marge dans chaque sous-table)? P>
5 Réponses :
(si je comprends correctement), 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 consiste à utiliser la fonction appliquer code>, mais spécifiquement pour les totaux, la fonction
margin.table code> 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 de creusage, j'ai constaté que la sortie XTABS dans ce cas est une matrice 3 dimensions et a écrit ce qui suit fonction pour obtenir le résultat souhaité (notez son incomplète, mais fonctionne pour les totaux de colonne jusqu'à présent): p>
Je n'ai clairement pas compris ce que vous vouliez, et je ne regarde toujours pas votre fonction. Peut-être que vous recherchez addmargins code>?
Si vous n'êtes pas lié à XTABS, le paquet de déducteur a de bonnes fonctions pour les tables de contingence:
> 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% | | ================================================================================
Aniko a mentionné cela dans un commentaire, mais il n'a jamais été fourni comme une réponse. P>
J'ai trouvé cela indépendamment puis remarqué qu'il était ici dans un commentaire, alors crédit à Aniko pour l'obtenir en premier. p>
pour une table donnée, on peut spécifier lequel des facteurs de classification à
développer par un ou plusieurs niveaux pour contenir des marges à calculer. Un peut
Par exemple, forment des sommes et des moyens sur la première dimension et médiane
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
La valeur par défaut est de somme sur toutes les marges de la table. Autres possibilités
peut donner des résultats qui dépendent de l'ordre dans lequel les marges sont
calculé. Ceci est marqué dans la sortie imprimée de la fonction. P>
blockQuote> addmargins code> est la réponse: p>