J'ai une matrice de corrélation qui s'est un peu brouillée. Les 1 ne sont pas à leur place. Je voudrais remettre les 1 sur les diagonales.
La matrice réelle est 1k x 1k mais voici un exemple.
QQQ SPY IWM ticker 1 1.0000000 0.7936952 0.6107246 QQQ 2 0.7936952 1.0000000 0.6995408 SPY 3 0.6107246 0.6995408 1.0000000 IWM
Je voudrais que la sortie soit:
mat = structure(list(QQQ = c(0.61072455, 1, 0.793695176), SPY = c(0.699540765, 0.793695176, 1), IWM = c(1, 0.61072455, 0.699540765), ticker = c("IWM", "QQQ", "SPY")), row.names = c(NA, -3L), class = "data.frame") print(mat) QQQ SPY IWM ticker 1 0.6107246 0.6995408 1.0000000 IWM 2 1.0000000 0.7936952 0.6107246 QQQ 3 0.7936952 1.0000000 0.6995408 SPY
3 Réponses :
Vous souhaitez organiser les lignes de la même manière que les colonnes. Utilisation de dplyr
:
QQQ SPY IWM ticker order 1 1.0000000 0.7936952 0.6107246 QQQ 1 2 0.7936952 1.0000000 0.6995408 SPY 2 3 0.6107246 0.6995408 1.0000000 IWM 3
Sortie (évidemment, vous pouvez maintenant supprimer la colonne order
):
mat %>% mutate(order = match(ticker, colnames(mat))) %>% arrange(order)
Marius Merci pour votre contribution !! J'ai décidé de suivre la réponse d'Akrun simplement parce que je n'ai pas à abandonner la colonne. Mais c'était super utile. Merci d'utiliser dplyr!
Nous pouvons utiliser match
dans base R
mat[order(match(mat$ticker, names(mat))),] # QQQ SPY IWM ticker #2 1.0000000 0.7936952 0.6107246 QQQ #3 0.7936952 1.0000000 0.6995408 SPY #1 0.6107246 0.6995408 1.0000000 IWM
mat [ c (mat $ ticker, "ticker")]
Une option serait de rechercher l'index de colonne où 1
apparaît pour chaque ligne, quelque chose comme:
ind = apply(mat[, 1:3], 1, function (x) which (x == 1)
Ce qui vous donnera un vecteur d'index de colonne où le 1
se produit. Ensuite, réorganisez les lignes de la matrice par index de colonne (croissant):
mat[order (ind), ]
Je suis sur mobile, je n'ai donc pas testé cela.
Modifier vous utilisez un bloc de données, pas une matrice. Le même principe s'applique mais vous devez exclure la colonne "ticker" dans votre instruction apply
:
ind = apply(mat, 1, function (x) which (x == 1)
Pour être encore plus sûr, utilisez near
ou all.equal
au lieu de ==
, vous devriez généralement éviter de tester l'égalité des nombres à virgule flottante (bien que cela fonctionne souvent bien dans R). p>
S'il existe d'autres corrélations de 1, cette approche deviendra problématique.
@elin vrai, mais ensuite je me demande quelle logique a été utilisée pour construire la colonne "ticker" en premier lieu puisque le même problème serait en jeu.