重新排列R中的相关矩阵以在诊断中获得1

时间:2019-08-09 02:09:47

标签: r dplyr data.table tidyverse

我的相关矩阵有些混乱。 1不合适。我想把1的对角线放回去。

实际矩阵是1k x 1k,但这是一个示例。

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

我希望输出为:

    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

看来我必须重新排列股票行的列以匹配列名。诸如sort(ticker,#by colnames)之类的东西将是完美的。看来sort()只能按升序/降序排列。

3 个答案:

答案 0 :(得分:2)

您希望以与列相同的方式使行排序。使用dplyr

mat %>%
    mutate(order = match(ticker, colnames(mat))) %>%
    arrange(order)

输出(显然,您现在可以删除order列):

        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

答案 1 :(得分:2)

我们可以在match中使用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

答案 2 :(得分:1)

一种选择是搜索每一行1所在的列索引,例如:

ind = apply(mat, 1, function (x) which (x == 1)

这将为您提供1所在的列索引向量。然后,通过(升序)列索引重新排列矩阵行:

mat[order (ind), ]

我在移动设备上,因此我尚未进行实际测试。

编辑,您正在操作的是数据框,而不是矩阵。同样的原则适用,但是您需要在apply语句中排除“ ticker列:

ind = apply(mat[, 1:3], 1, function (x) which (x == 1)

为了更加安全,请使用nearall.equal而不是==,通常应避免测试浮点数是否相等(尽管在R中通常是可以的)。 / p>