【问题标题】:Replacing tied rank by their average [duplicate]用他们的平均值替换并列排名[重复]
【发布时间】:2020-06-21 18:25:12
【问题描述】:

我有以下数据框:

> x
  tags freq.Freq
1    a       740
2    b       722
3    c       722
4    d       541
5    e       525
6    f       525
7    g       525
8    h       326
9    i       296

x<- structure(list(tags = c("a", "b", "c", "d", "e", "f", "g", "h", "i"),
 freq.Freq = c(740L, 722L, 722L, 541L, 525L, 525L, 525L, 326L, 296L)), 
class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9"))

我想用tags 中每个字母的排名来替换freq.Freq 列。例如,a 是 1,d 是 4,i 是 9。无论如何,bcefg 具有相同的排名。对于这些情况,我想用“并列”排名的平均值替换freq.Freq。这样,期望的输出是:

  tags freq.Freq
1    a       1
2    b       2.5
3    c       2.5
4    d       4
5    e       6
6    f       6
7    g       6
8    h       8
9    i       9

我的尝试:

library(dplyr)
min_rank(x$freq.Freq)

给出错误的结果:

9 7 7 6 3 3 3 2 1

【问题讨论】:

    标签: r ranking


    【解决方案1】:
    x %>%
        mutate(rank = match(tags, letters)) %>%
        group_by(freq.Freq) %>%
        mutate(rank = mean(rank)) %>%
        ungroup()
    

    markus 建议的基本 R 版本

    transform(x, new = ave(match(tags, letters), freq.Freq, FUN = mean))
    

    【讨论】:

    • 刚刚看到你的帖子,这也是我的想法。也许您可以添加基本 R 选项:transform(x, new = ave(match(tags, letters), freq.Freq, FUN = mean))
    【解决方案2】:

    我们可以只使用来自base Rrankties.method 的默认方法是“平均”

    x$freq.Freq <- rank(-x$freq.Freq)
    x$freq.Freq
    #[1] 1.0 2.5 2.5 4.0 6.0 6.0 6.0 8.0 9.0
    

    【讨论】:

      猜你喜欢
      • 2017-04-11
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多