rowsum pour la matrice de sur-spécifié nombre de colonnes dans la R
Que j'essaie de faire la somme des colonnes dans une matrice R pour un certain rang. Cependant, je ne veux pas l'ensemble de la ligne pour être additionnées, mais seulement un certain nombre de colonnes, c'est à dire, dans ce cas, toutes les colonnes au-dessus de la diagonale. J'ai essayé de somme et rowSums fonction, mais ils sont soit de me donner des résultats étranges ou un message d'erreur. À titre d'exemple, voir l'exemple de code pour un 8x8 de matrice ci-dessous. Pour la première ligne j'ai besoin de la somme de la ligne à l'exception de la rubrique [1,1], pour la deuxième rangée, la somme à l'exception des articles [2,1] et [2,2] etc.
m1 <- matrix(c(0.2834803,0.6398198,0.0766999,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,
0.0000000,0.1101746,0.6354086,0.2544168,0.0000000,0.0000000,0.0000000,0.0000000,
0.0000000,0.0000000,0.0548145,0.9451855,0.0000000,0.0000000,0.0000000,0.0000000,
0.0000000,0.0000000,0.0000000,0.3614786,0.6385214,0.0000000,0.0000000,0.0000000,
0.0000000,0.0000000,0.0000000,0.0000000,0.5594658,0.4405342,0.0000000,0.0000000,
0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.7490395,0.2509605,0.0000000,
0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.5834363,0.4165637,
0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,1.0000000),
8, 8, byrow = TRUE,
dimnames = list(c("iAAA", "iAA", "iA", "iBBB", "iBB", "iB", "iCCC", "iD"),
c("iAAA_p", "iAA_p", "iA_p", "iBBB_p", "iBB_p", "iB_p", "iCCC_p", "iD_p")))
J'ai essayé ce qui suit:
rowSums(m1[1, 2:8]) --> Error in rowSums(m1[1, 2:8]) :
'x' must be an array of at least two dimensions
Sinon:
sum(m1[1,2]:m1[1,8]) --> wrong result of 0.6398198 (which is item [1,2])
Que je comprends rowSums besoins d'un tableau plutôt qu'un vecteur (bien que pas très bien pourquoi). Mais je ne comprends pas pourquoi le deuxième chemin à l'aide de la somme ne fonctionne pas. Idéalement, il est possible de seulement la somme de toutes les colonnes d'une ligne qui se trouvent au-dessus de la diagonale.
Merci beaucoup!
OriginalL'auteur Triamus | 2013-06-25
Vous devez vous connecter pour publier un commentaire.
Le problème est que vous n'êtes pas le passage d'un tableau à
rowSums
:C'est un vecteur numérique. Utiliser plus d'une seule ligne et il fonctionne très bien:
Si vous souhaitez calculer la somme de toutes les colonnes qui se trouvent au-dessus de la diagonale, alors vous pouvez utiliser
lower.tri
pour définir tous les éléments sous la diagonale, pour0
(ou peut-êtreNA
) et ensuite utiliserrowSums
. Si vous ne souhaitez pas inclure les éléments de la diagonale lui-même, vous pouvez définirdiag = TRUE
(merci à @Fabio pour le signaler):Merci pour la réponse rapide! Le truc c'est que je n'ai besoin que les sommes des lignes spécifiques et non pas à l'ensemble triangulaire.
puis
rowSums(m1[ c(1,2,6) , ] )
pour larowSums
de la première, deuxième et sixième lignes par exemple. Vraiment, je vous recommande la lecture de certains tutoriaux sur.. Voir?`[`
Marroni: C'est une solution sympa! Ce que je n'ai pas mentionné ici, c'est que j'ai aussi besoin des valeurs de la triangulaire inférieure pour les autres matrices, donc je suppose que je vais devoir le faire en 2 étapes. Pour vous donner le contexte, c'est une notation shift/notation de transition/notation de matrice de migration employé dans le crédit de l'analyse. Parfois, je suis intéressé par les deux haut - et déclasse c'est pourquoi j'ai besoin des deux triangulars. Merci beaucoup! Cela aide.
désolé, je suis nouveau sur pile. Je peux en quelque sorte voter pour les réponses c'est à dire qu'ils ont résolu ma question dans le bon sens? Merci!
OriginalL'auteur Simon O'Hanlon