Мы можем сделать sort
для отдельных столбцов с помощью lapply
и присвоить вывод list
обратно исходному набору данных
df[] <- lapply(df, sort, decreasing = TRUE)
Если нам также нужны имена строк (не на основе на ожидаемом выходе - это vector
)
lst1 <- lapply(names(df), function(nm) {
dat <- df[nm]
dat[order(dat[[1]], decreasing = TRUE), , drop = FALSE]
})
lst1[[1]]
# red
#a 21
#c 6
#b 4
#d 4
lst1[[2]]
# blue
#b 65
#a 45
#d 4
#c 2
Если целью является создание нескольких объектов (не рекомендуется)
list2env(setNames(lapply(lst1, row.names), names(df)), .GlobalEnv)
red
#[1] "a" "c" "b" "d"
blue
#[1] "b" "a" "d" "c"
black
#[1] "d" "b" "a" "c"
Или это может быть упрощено
list2env(lapply(df, function(x)
row.names(df)[order(x, decreasing = TRUE)]), .GlobalEnv)
Или с tidyverse
library(dplyr)
library(tibble)
library(tidyr)
rownames_to_column(df, 'rn') %>%
pivot_longer(cols = -rn) %>%
arrange(name, desc(value)) %>%
{split(.$rn, .$name)} %>%
list2env(.GlobalEnv)
Или, если значения должны быть выведены для каждого из новых объектов *
list2env(lapply(df, sort, decreasing = TRUE), .GlobalEnv)
red
#[1] 21 6 4 4
blue
#[1] 65 45 4 2
black
#[1] 60 34 7 1
Или используя for
l oop с assign
for(nm in names(df)) assign(nm, sort(df[[nm]], decreasing = TRUE))
В dplyr
, это можно сделать с помощью
df %>%
mutate_all(sort, decreasing = TRUE)