【问题标题】:Ranking observations within groups that are tied对相关组内的观察结果进行排名
【发布时间】:2020-04-20 02:55:07
【问题描述】:

我正在尝试使用dense_rank 按计数对某些组进行排名,它不会对并列的组进行不同的排名。我尝试的任何具有某种ties.method 的排名函数都不会以连续的 1、2、3 顺序给我排名。示例:

library(dplyr)
id <- c(rep(1, 8),
        rep(2, 8))

fruit <- c(rep('apple', 4), rep('orange', 1), rep('banana', 2), 'orange',
           rep('orange', 4), rep('banana', 1), rep('apple', 2), 'banana')

df <- data.frame(id, fruit, stringsAsFactors = FALSE)

df2 <- df %>% 
  mutate(counter = 1) %>% 
  group_by(id, fruit) %>% 
  mutate(fruitCnt = sum(counter)) %>% 
  ungroup() %>% 
  group_by(id) %>% 
  mutate(fruitCntRank = dense_rank(desc(fruitCnt))) %>% 
  select(id, fruit, fruitCntRank)
df2

      id fruit  fruitCntRank
 1     1 apple             1
 2     1 apple             1
 3     1 apple             1
 4     1 apple             1
 5     1 orange            2
 6     1 banana            2
 7     1 banana            2
 8     1 orange            2
 9     2 orange            1
10     2 orange            1
11     2 orange            1
12     2 orange            1
13     2 banana            2
14     2 apple             2
15     2 apple             2
16     2 banana            2

橙色或香蕉中的哪一个排在第 3 位无关紧要,甚至不需要保持一致。我只需要将组排在第 1、2、3 位。

想要的结果:

      id fruit  fruitCntRank
 1     1 apple             1
 2     1 apple             1
 3     1 apple             1
 4     1 apple             1
 5     1 orange            2
 6     1 banana            3
 7     1 banana            3
 8     1 orange            2
 9     2 orange            1
10     2 orange            1
11     2 orange            1
12     2 orange            1
13     2 banana            2
14     2 apple             3
15     2 apple             3
16     2 banana            2

【问题讨论】:

标签: r dplyr


【解决方案1】:

我们可以为每个idfruit 组合添加计数,arrange 它们按计数的降序排列,并使用match 获得排名。

library(dplyr)

df %>%
  add_count(id, fruit) %>%
  arrange(id, desc(n)) %>%
  group_by(id) %>%
  mutate(n = match(fruit, unique(fruit)))
  #Another option with cumsum and duplicated
  #mutate(n = cumsum(!duplicated(fruit)))

#      id fruit      n
#   <dbl> <chr>  <int>
# 1     1 apple      1
# 2     1 apple      1
# 3     1 apple      1
# 4     1 apple      1
# 5     1 orange     2
# 6     1 banana     3
# 7     1 banana     3
# 8     1 orange     2
# 9     2 orange     1
#10     2 orange     1
#11     2 orange     1
#12     2 orange     1
#13     2 banana     2
#14     2 apple      3
#15     2 apple      3
#16     2 banana     2

【讨论】:

  • 看起来像您的第一个解决方案,它实际上只是按字母顺序排列,与预期的结果不匹配。我会尝试你的其他解决方案和group_indices,谢谢
  • @CoolGuyHasChillDay 我想我之前误解了你的问题。我没有考虑计数。您可以尝试更新的答案吗?
  • 嘿抱歉,这不清楚,我正在尝试对每个id 组中的观察次数最多到观察次数最少的组进行排名。所以你的最新答案对id = 1 是正确的,但不是id = 2。我想让它在一个 dplyr 语句中工作,但我想我可以用df %&gt;% count(id, fruit) %&gt;% arrange(id, desc(n)) %&gt;% group_by(id) %&gt;% mutate(fruitCntRank = 1:n()) 制作一个桥接表并重新加入
  • 抱歉,我不得不从 arrange 中删除 fruit。它现在应该可以根据您的要求工作。可以查一下吗?
猜你喜欢
  • 2011-09-03
  • 1970-01-01
  • 2020-09-19
  • 2016-07-04
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
相关资源
最近更新 更多