Создать нисходящие ранги для набора столбцов, используя dplyr - PullRequest
0 голосов
/ 05 ноября 2018

Как использовать dplyr для создания рангов для каждого столбца на основе нисходящих значений для нескольких столбцов? Код ниже, по-видимому, не учитывает параметр desc в arrange_at

rank_f <- function(ds, cols, fs){
          ds %>%arrange_at(desc(vars(!!!cols)))%>%
            mutate_at(vars(!!!cols), funs(!!!fs))
        }


USArrests %>%tibble::rownames_to_column()%>%
     rank_f(quos((Murder:Rape)),quos(min_rank))->ranked


head(USArrests) 
#              Murder Assault UrbanPop Rape
# Alabama      13.2     236       58 21.2
# Alaska       10.0     263       48 44.5
# Arizona       8.1     294       80 31.0
# Arkansas      8.8     190       50 19.5
# California    9.0     276       91 40.6
# Colorado      7.9     204       78 38.7

head(ranked)
#        rowname Murder Assault UrbanPop Rape
# 1    Alabama     44      35       16   29
# 2     Alaska     35      43        7   49
# 3    Arizona     29      47       39   43
# 4   Arkansas     31      31        9   24
# 5 California     32      44       50   48
# 6   Colorado     28      33       38   47

Чем выше показатель, тем ниже должен быть ранг, а это не так.

1 Ответ

0 голосов
/ 05 ноября 2018

Нам нужно разместить это внутри funs

out1 <- USArrests %>%
           tibble::rownames_to_column() %>% 
           arrange_at(vars(Murder:Rape), funs(desc)) 

Проверка с применением desc к каждому столбцу

out2 <-  USArrests %>% 
             tibble::rownames_to_column() %>% 
             arrange(desc(Murder), desc(Assault), desc(UrbanPop), desc(Rape))
identical(out1, out2)
#[1] TRUE

На основании вышеизложенного мы можем внести изменения в rank_f

out3 <-  out2 %>%
             mutate_at(vars(Murder:Rape), min_rank) 
rank_f <- function(ds, cols, fs){
          ds %>%
               arrange_at(vars(!!!cols), funs(desc))%>%
               mutate_at(vars(!!!cols), funs(!!!fs))
        }
out4 <- USArrests %>%
             tibble::rownames_to_column()%>%
             rank_f(quos((Murder:Rape)),quos(min_rank))

identical(out3, out4)
#[1] TRUE

Обновление

Исходя из комментариев OP, нам не нужно ничего делать arrange, мы можем напрямую применить min_rank, преобразовав значения столбца в отрицательные

USArrests %>% 
   tibble::rownames_to_column() %>% 
   mutate_at(vars(Murder:Rape), funs(min_rank(-.)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...