在组中出现时对角色变量进行排名

时间:2018-10-23 21:51:54

标签: r dplyr tidyverse

这是我的数据:

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按组对数据进行了排列。我想对var的内容进行排名,因为它们属于该组。例如,D在组1中排在第二位,因此获得了等级2,而在组2中排在第一位时,它获得了组2的排名1。

我尝试了这个,但是输出不正确。

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

请提出解决方案。

2 个答案:

答案 0 :(得分:2)

使用match的半tidyverse选项

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

答案 1 :(得分:1)

一种dplyrdata.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