【问题标题】:How to save values from matrix to another with keeping columns and rows names unchanged in R?如何在R中保持列和行名称不变的情况下将值从矩阵保存到另一个?
【发布时间】:2017-10-18 02:10:43
【问题描述】:

我有一个相关矩阵data.corr,其中包含 163 家公司,因此矩阵维度为 163 行和 163 列。

我想对每个公司的相关值最高的5个进行排序,所以我写了以下代码:

COR<- matrix(nrow = 5, ncol = 163)
for(i in 1:163){COR[,i]<-tail(sort(data.corr[i,]),5)}

它工作得很好,但它没有从每个值的原始相关矩阵中复制行和列名称的问题。

行名和列名是公司名。 这是相关矩阵的示例:

    head(data.corr)
X601288.SS X601988.SS X601998.SS X601818.SS X601939.SS X601398.SS
X601288.SS  1.0000000  0.7628263  0.6130694  0.7947062  0.7578003  0.7568238
X601988.SS  0.7628263  1.0000000  0.7280957  0.6925497  0.8402101  0.8409767
X601998.SS  0.6130694  0.7280957  1.0000000  0.6715793  0.7118446  0.6716997
X601818.SS  0.7947062  0.6925497  0.6715793  1.0000000  0.6825405  0.6471228
X601939.SS  0.7578003  0.8402101  0.7118446  0.6825405  1.0000000  0.8390544
X601398.SS  0.7568238  0.8409767  0.6716997  0.6471228  0.8390544  1.0000000

这里是最高五个相关性的样本:

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

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

【问题讨论】:

  • 行/列名是公司名吗?如果是这样,您的COR 矩阵中的 5 列的名称是否需要每行不同?如果行/列名称只是索引,你可以在之后重新编号吗?发布一些示例数据并更好地解释您正在尝试做的事情会有所帮助。
  • 是的,行/列名称是公司名称。是的,COR 中的名称应该与 data.corr 中的值的名称匹配。我已经编辑了问题并发布了示例。
  • 您的示例中的行/列名称是什么?我假设行名称只是 1...5 而列名称是公司名称?还是行名也需要是公司名?
  • 如果公司名称在同一顺序,你可以colnames(COR) &lt;- colnames(data.corr)
  • 它们的顺序不同,这是我写问题时必须注意的。

标签: arrays r sorting matrix indexing


【解决方案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 )]

【讨论】:

    【解决方案2】:

    这是一种使用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)
    

    【讨论】:

    • 我应用了它,但它给了我一切的相关性,不仅是最高的相关性
    • 您需要从输出中创建一个新的 data.table。我修改了答案。
    猜你喜欢
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 2019-10-01
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多