Плотное ранжирование столбца по порядку второго столбца - PullRequest
0 голосов
/ 19 декабря 2018

Я бью себя над чем-то, что, вероятно, прямо вперед.Я хочу получить «плотное» ранжирование (как определено для функции data.table::frank) по столбцу во фрейме данных, но не на основе правильного порядка столбцов, порядок должен быть задан другимстолбец (val в моем примере)

Мне удалось получить плотное ранжирование с помощью решения @ Прасада Чаласани , например:

library(dplyr)
foo_df <- data.frame(id = c(4,1,1,3,3), val = letters[1:5])

foo_df %>% arrange(val) %>% mutate(id_fac = as.integer(factor(id)))
#>   id val id_fac
#> 1  4   a      3
#> 2  1   b      1
#> 3  1   c      1
#> 4  3   d      2
#> 5  3   e      2

Но яхотел бы, чтобы уровни факторов были упорядочены на основе val.Желаемый результат:

foo_desired <-  foo_df %>% arrange(val) %>% mutate(id_fac = as.integer(factor(id, levels = c(4,1,3))))
foo_desired
#>   id val id_fac
#> 1  4   a      1
#> 2  1   b      2
#> 3  1   c      2
#> 4  3   d      3
#> 5  3   e      3
  • Я попробовал data.table::frank
  • Я попробовал оба метода @Prasad Chalasani.
  • Я попытался установить порядок idиспользуя id[rank(val)]sort(val), и order(val)).
  • Наконец, я также попытался отсортировать уровни, используя rank(val) и т. д., но это выдает ошибку (Evaluation error: factor level [3] is duplicated.)

  • Я знаю, что можно указать порядок уровней, я использовал это для создания желаемого выхода.Это решение, однако, невелико, так как в моих данных гораздо больше строк и уровней

Мне это нужно для удобства, чтобы создать таблицу с определенным порядком, а не для вычислений.

Создано в 2018-12-19 с помощью представительного пакета (v0.2.1)

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Зачем вам вообще нужно factors?Не уверен, что я что-то упустил, но это дает желаемый результат.

Вы можете использовать match для получения id_fac в зависимости от появления id с.

library(dplyr)

foo_df %>%
    mutate(id_fac = match(id, unique(id)))

#  id val id_fac
#1  4   a      1
#2  1   b      2
#3  1   c      2
#4  3   d      3
#5  3   e      3
0 голосов
/ 19 декабря 2018

Вы можете проверить с помощью first

foo_df %>% arrange(val) %>% 
          group_by(id)%>%mutate(id_fac = first(val))%>%
          ungroup()%>%
          mutate(id_fac=as.integer(factor(id_fac)))
# A tibble: 5 x 3
     id    val id_fac
  <dbl> <fctr>  <int>
1     4      a      1
2     1      b      2
3     1      c      2
4     3      d      3
5     3      e      3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...