我的相关矩阵有些混乱。 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()只能按升序/降序排列。
答案 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)
为了更加安全,请使用near
或all.equal
而不是==
,通常应避免测试浮点数是否相等(尽管在R中通常是可以的)。 / p>