2017-09-04 5 views
0

Je veux trier une colonne d'une matrice en fonction du rang des sommes de lignes des autres colonnes. Donc j'utilise ce code:R - la fonction de tri change la matrice

for(j in 1:d) { 
    X[,j]=sort(X[,j],decreasing=TRUE)[rank(rowSums(X[,c(1:d)[-j]]))] 
} 

Mais ce code change les valeurs de la colonne, que je veux juste réorganiser. Lorsque les sommes de ligne sont égales, la valeur de la jième colonne devient égale, bien qu'il n'y ait qu'une seule valeur dans la colonne d'origine. Un exemple:

example

Comment puis-je éviter ce problème?

Merci

+0

Vous avez probablement besoin d'une virgule à la fin de votre déclaration 'rank' - comme vous êtes juste s'indexation dans une dimension, ce qui signifie que R est le tri comme un vecteur. –

+0

Cela ne fonctionne pas dans mon exemple. Mais il devrait être trié comme un vecteur ou non? – Applekes

+0

Vous savez que vous réorganisez les colonnes indépendamment à chaque étape et que vous utilisez ensuite la matrice modifiée pour calculer de nouveaux rangs? Je pense que vous pourriez rechercher 'for (j dans 1: d) {X [, j] = X [ordre (rowSums (X [, c (1: d) [- j]]), diminuant = TRUE), j]} 'mais je ne suis pas sûr de ce que vous essayez d'accomplir. Ce serait plus facile avec un exemple reproductible et la sortie attendue –

Répondre

0

Espérons que cela aide!

#sample data 
x <- matrix(c(1,1,1,2,2,2,3,3,3), nrow=3, ncol=3, byrow=T) 

#if you want to sort by row-sum of 2nd & 3rd column 
x[order(rowSums(x[,-1]), decreasing = T),] 
#if you want to sort by row-sum of 1st & 2nd column 
x[order(rowSums(x[,-3]), decreasing = T),] 

Ainsi, la mise en boucle finale pourrait être

x <- matrix(c(1,1,1,2,2,2,3,3,3), nrow=3, ncol=3,byrow=T) 
X <- x 
for(j in 1:ncol(x)) { 
    X[,j]=x[order(rowSums(x[,-j]), decreasing = T),j] 
}