我有一个相关矩阵head(COR)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 0.7568238 0.7280957 0.6894561 0.6715793 0.7558052 0.7323083 0.7323083 0.6894561
[2,] 0.7578003 0.7628263 0.7118446 0.6825405 0.7578003 0.7568238 0.7472125 0.6956420
[3,] 0.7628263 0.8402101 0.7223088 0.6925497 0.8390544 0.8390544 0.7558052 0.7007705
[4,] 0.7947062 0.8409767 0.7280957 0.7947062 0.8402101 0.8409767 0.7618053 0.7618053
[5,] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
,由163家公司组成,因此矩阵维度为163行和163列。
我想对每个公司的最高5个相关值进行排序,因此我编写了以下代码:
{{1}}
它运行良好,但问题是它不会从每个值的原始相关矩阵中复制行和列名称。
行名和列名是公司名称。 这是相关矩阵的样本:
{{1}}
这里是最高五个相关性的样本:
{{1}}
如何使用匹配的列名和行名对值进行排序?
答案 0 :(得分:1)
这样的事情应该简化你的代码并为你工作:
# Toy data
data.corr <- cor(matrix(rnorm(200), 20, 10))
rownames(data.corr) <- colnames(data.corr) <- paste0("company", 1:10)
print(data.corr)
# Get highest correlations for each company
COR <- apply(data.corr, 2, sort, decreasing = TRUE)[1:5 + 1, ]
# Get corresponding rows / companies
COR_comp <- apply(data.corr, 2, order, decreasing = TRUE)[1:5 + 1, ]
如果您坚持使用COR_comp
中显示的名称(而不是数字),则可以进一步修改。例如,以下内容将填写公司名称:
COR_comp[] <- colnames(COR_comp )[c(COR_comp )]
答案 1 :(得分:1)
以下是使用data.table
和dplyr
require(data.table)
require(dplyr)
# example data
data <- matrix(rnorm(1000), nrow = 20) %>% data.frame
data.corr <- cor(data)
melted_data <- data.corr %>%
data.frame %>% # convert to a data.frame
mutate(row_company = row.names(.)) %>% # create a new variable from col.name
melt(id.vars = "row_company") # change the data shape from wide to long
setDT(melted_data) # crate a data.table
# sort the data first by compnay and decending order of the correlation)
# when select top 5 in each company
final_output <- melted_data[order(variable, -value)][, head(.SD, 5), by=variable]
head(final_output, 10)