Проблема с использованием dplyr :: order для ранжирования значений от наименьшего к наибольшему, включая положительные целые числа меньше 1 - PullRequest
1 голос
/ 22 апреля 2019

Я хочу ранжировать euclid_dist комбинаций, сгруппированных по pitch_2 в моем фрейме данных, от наименьшего к наибольшему g. Мой фрейм данных содержит более 80 миллионов комбинаций различных pitch_2s, которые я и группирую по ним. Но порядок кажется почти случайным, когда самый маленький euclid_dist не получает ранг № 1, когда я смотрю на свои данные. Я подумал, что, возможно, проблема в том, что кто-то ниже 1, и тогда начался подсчет, но он даже не работает при значениях больше 1.

Это команда, которую я использую для ранжирования

data <- data %>% group_by(pitch_2) %>% 
  mutate(rank = order(euclid_dist))

но это то, как мой фрейм данных выглядит потом - он правильно начинается с 1 для каждого pitch_2 при ранжировании, но сами рейтинги не в порядке, и я не уверен, как изменить порядок или есть лучший подход

> head(data)
# A tibble: 6 x 4
# Groups:   pitch_2 [1]
  pitch_1   pitch_2   euclid_dist  rank
  <fct>     <fct>           <dbl> <int>
1 429721-CU 493247-SI        2.53    15
2 114849-FC 493247-SI        3.52     6
3 430599-FF 493247-SI        3.49    14
4 458567-FF 493247-SI        2.59    27
5 435261-CU 493247-SI        3.10     8
6 425629-CU 493247-SI        2.14    17

1 Ответ

0 голосов
/ 22 апреля 2019

Нам нужно rank вместо order. Согласно ?rank

Возвращает выборочные ранги значений в векторе.

library(dplyr)
data %>%
       group_by(pitch_2) %>% 
       mutate(rank = order(euclid_dist))
# A tibble: 6 x 4
# Groups:   pitch_2 [1]
#  pitch_1   pitch_2   euclid_dist  rank
#  <chr>     <chr>           <dbl> <dbl>
#1 429721-CU 493247-SI        2.53     2
#2 114849-FC 493247-SI        3.52     6
#3 430599-FF 493247-SI        3.49     5
#4 458567-FF 493247-SI        2.59     3
#5 435261-CU 493247-SI        3.1      4
#6 425629-CU 493247-SI        2.14     1

Данные

data <- structure(list(pitch_1 = c("429721-CU", "114849-FC", "430599-FF", 
"458567-FF", "435261-CU", "425629-CU"), pitch_2 = c("493247-SI", 
"493247-SI", "493247-SI", "493247-SI", "493247-SI", "493247-SI"
), euclid_dist = c(2.53, 3.52, 3.49, 2.59, 3.1, 2.14), rank = c(15L, 
6L, 14L, 27L, 8L, 17L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))
...