Один вариант с использованием функций baseR:
data[] <- Map(`[`, data, split(sorting_order, col(sorting_order)))
data
# A tibble: 3 x 3
# name height mass
# <chr> <int> <dbl>
#1 C-3PO 96 77
#2 R2-D2 167 32
#3 Luke Skywalker 172 75
1) Из вашей матрицы мы создаем список векторов:
split(sorting_order, col(sorting_order))
#$`1`
#[1] 2 3 1
#
#$`2`
#[1] 3 2 1
#
#$`3`
#[1] 1 3 2
Более простой способ, упомянутый в комментариях is asplit
asplit(sorting_order, 2)
Благодаря @ GKi
2) Map
используется для перестановки data
согласно списку из 1). В качестве примера возьмем первый столбец:
data[, 1, drop = TRUE][c(2,3,1)]
#[1] "R2-D2" "Luke Skywalker" "C-3PO"
Это делается только для каждого столбца.