Мы превращаем 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")))