Как отсортировать матрицу символов в соответствии с отсортированной числовой матрицей? - PullRequest
1 голос
/ 20 апреля 2019

У меня есть матрица студента 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

У меня есть идея отсортировать матрицу grades с использованием apply(grades, 2, sort, decreasing=TRUE), а затем создать матрицу (назовем ее temp) примерно так: matrix(rownames(grades), nrow=nrow(grades), ncol=ncol(grades), dimnames=list(c(NULL), c(colnames(grades)))), в которой будет заполняться каждая строка временной матрицы по именам рядов классов. И затем каким-то образом передать значение grades в temp, а затем я сортирую его.

Может кто-нибудь помочь решить эту проблему лучше или дать мне знать, как передать значение grades в temp без изменения элементов temp?

1 Ответ

1 голос
/ 20 апреля 2019

Мы превращаем 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, перебрать столбец matrix, order значений столбца в порядке убывания, используйте индекс для упорядочения имен строк, как указано выше

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")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...