создать векторы для каждого упорядоченного столбца df r - PullRequest
1 голос
/ 13 января 2020

У меня есть df:

red<- c(21,4,6,4)
blue<- c(45,65,2,4)
black<- c(7,34,1,60)
df<- data.frame(red, blue, black)
row.names(df)<- c('a','b','c','d')

Я хотел бы упорядочить каждый столбец (уменьшая = ИСТИНА) df и создать вектор этого упорядоченного столбца (каждый вектор называется именем столбца) Например:

red = 21,6,4,4
blue = 65,45,4,2
black = 60,34,7,1

Я попытался сделать это для первого столбца:

z<-numeric(0)
for (i in 1)){

j<-order(df[,i], decreasing = TRUE)
n<-names(df)[i]
z<-paste(n,k)}

Но это неправильно, так как сначала печатается имя каждый раз (я хочу вставить только имя один раз) и он дает мне индекс, и я хочу имена строк)

Как вы можете сказать, я новичок

1 Ответ

1 голос
/ 13 января 2020

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