如何在R中保持列和行名称不变,从而将值从矩阵保存到另一个?

时间:2017-05-18 10:06:01

标签: arrays r sorting matrix indexing

我有一个相关矩阵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}}

如何使用匹配的列名和行名对值进行排序?

2 个答案:

答案 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.tabledplyr

执行此操作的方法
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)