Вы можете использовать tidyr::spread
и ::gather
для этого:
dat <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
id1 id2 id3
rank1 red green blue
rank2 green blue red
rank3 blue red green')
library(dplyr)
library(tidyr)
dat %>%
tibble::rownames_to_column() %>%
gather(id, color, -rowname) %>%
spread(id, rowname) %>%
tibble::column_to_rownames(var="color")
# id1 id2 id3
# blue rank3 rank2 rank1
# green rank2 rank1 rank3
# red rank1 rank3 rank2
(column_to_rownames
предназначался исключительно для соответствия вашим спецификациям, но я не рекомендую использовать имена строк.)
При желании можно вставить команду для удаления текста rank
из рядов:
dat %>%
tibble::rownames_to_column() %>%
mutate(rowname = gsub("\\D", "", rowname)) %>%
gather(id, color, -rowname) %>%
spread(id, rowname) %>%
tibble::column_to_rownames(var="color")
# id1 id2 id3
# blue 3 2 1
# green 2 1 3
# red 1 3 2
или даже mutate(rowname = as.integer(gsub("\\D", "", rowname)))
, если вы хотите, чтобы они были целыми числами.