【问题标题】:How do I sort a character matrix according to a sorted number matrix?如何根据已排序的数字矩阵对字符矩阵进行排序?
【发布时间】:2019-04-20 16:45:37
【问题描述】:

我有一个学生grades 的矩阵。

         Winston  Ariana  James
Math          50      70     90
Science       85      90     50
Biology       40      30     80

如何将该矩阵转换为学生表现最佳课程的排序矩阵?

Winston   Ariana   James
Science   Science  Math 
Math      Math     Biology
Biology   Biology  Science

我的想法是使用apply(grades, 2, sort, decreasing=TRUE)grades 矩阵进行排序,然后创建一个矩阵(我们称之为temp),如下所示:matrix(rownames(grades), nrow=nrow(grades), ncol=ncol(grades), dimnames=list(c(NULL), c(colnames(grades)))),其中将填充临时矩阵的每一行通过等级的行名。然后以某种方式将grades的值传递给temp,然后我对其进行排序。

谁能帮助以更好的方式解决这个问题,或者让我知道如何在不更改temp 的元素的情况下将grades 的值传递给temp

【问题讨论】:

    标签: r


    【解决方案1】:

    我们将matrix 转换为data.frame,将行名创建为列(rownames_to_column),mutate 除第一列之外的列,order 按降序排列值,然后使用它来索引要重新排列每列中的行名,请将“rn”列转换回行名并再次将其更改为matrix

    library(tidyverse)
    m1 %>% 
      as.data.frame %>% 
      rownames_to_column('rn') %>%
      mutate_at(-1, list(~ rn[order(., decreasing = TRUE)])) %>%
      column_to_rownames('rn') %>%
      as.matrix
    #     Winston   Ariana    James    
    #Math    "Science" "Science" "Math"   
    #Science "Math"    "Math"    "Biology"
    #Biology "Biology" "Biology" "Science"
    

    或者我们可以将melt 转换为'long' 格式,将arrange 转换为'long' 格式,然后执行spread

    library(reshape2)
    melt(m1) %>%
       arrange(Var2, desc(value)) %>% 
       group_by(Var2) %>%      
       mutate(rn = row_number()) %>%
       dplyr::select(-value) %>% 
       spread(Var2, Var1)
    

    或使用base R,循环遍历matrixorder的列值以降序排列,使用索引对行名进行排序,如上

    apply(m1, 2, function(x) row.names(m1)[order(x, decreasing = TRUE)])
    #    Winston   Ariana    James    
    #[1,] "Science" "Science" "Math"   
    #[2,] "Math"    "Math"    "Biology"
    #[3,] "Biology" "Biology" "Science"
    

    数据

    m1 <- structure(c(50L, 85L, 40L, 70L, 90L, 30L, 90L, 50L, 80L), .Dim = c(3L, 
     3L), .Dimnames = list(c("Math", "Science", "Biology"),
      c("Winston", "Ariana", "James")))
    

    【讨论】:

      猜你喜欢
      • 2020-11-04
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多