Ранговая символьная переменная, как они встречаются в группах - PullRequest
0 голосов
/ 24 октября 2018

Вот мои данные:

df <- tibble::tribble(
  ~group, ~sort_var, ~var, ~desired_rank,
      1L,        3L,  "A",            1L,
      1L,        4L,  "A",            1L,
      1L,        5L,  "D",            2L,
      1L,        6L,  "C",            3L,
      2L,        1L,  "D",            1L,
      2L,        2L,  "B",            2L,
      2L,        3L,  "C",            3L,
      2L,        4L,  "B",            2L)

Данные уже упорядочены с использованием sort_var по группам.Я хочу оценить содержимое вар, как они входят в группу.Например, D занимает второе место в группе 1, поэтому он получает ранг 2, в то время как он получает ранг 1 в группе 2, так как он занимает 1-е место в этой группе.

Я пробовал это, но получал неправильный вывод.

df %>% group_by(group) %>% 
  mutate(incorrect_rank = rank(var))

Пожалуйста, предложите решение.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

A dplyr и data.table решение:

df %>%
    group_by(group)  %>%
    mutate(temp = rleid(var)) %>%
    group_by(group, var) %>%
    mutate(rank = ifelse(temp != 0, first(temp), NA)) %>%
    ungroup() %>%
    select(-temp)

  group sort_var var   desired_rank  rank
  <int>    <int> <chr>        <int> <int>
1     1        3 A                1     1
2     1        4 A                1     1
3     1        5 D                2     2
4     1        6 C                3     3
5     2        1 D                1     1
6     2        2 B                2     2
7     2        3 C                3     3
8     2        4 B                2     2
0 голосов
/ 24 октября 2018

Вариант полудиверса с использованием match

library(dplyr)
df %>% group_by(group) %>% 
  mutate("(in)correct_rank" = match(var, unique(var)))
# A tibble: 8 x 5
# Groups:   group [2]
#  group sort_var var   desired_rank `(in)correct_rank`
#  <int>    <int> <chr>        <int>              <int>
#1     1        3 A                1                  1
#2     1        4 A                1                  1
#3     1        5 D                2                  2
#4     1        6 C                3                  3
#5     2        1 D                1                  1
#6     2        2 B                2                  2
#7     2        3 C                3                  3
#8     2        4 B                2                  2
...