这是我的数据:
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))
请提出解决方案。
答案 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)
一种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