【问题标题】:How I can create a new ties.method with the R rank() function? [duplicate]如何使用 R rank() 函数创建新的 ties.method? [复制]
【发布时间】:2010-07-07 19:09:52
【问题描述】:

我正在尝试按人口和日期对该数据框进行排序,因此我使用了 order()rank() 函数:

> df <- data.frame(idgeoville = c(5, 8, 4, 3, 4, 5, 8, 8),
                   date       = c(rep(1950, 4), rep(2000, 4)),
                   population = c(500, 450, 350, 350, 650, 500, 500, 450))
> df
   idgeoville date    population
1  5          1950     500
2  8          1950     450
3  4          1950     350
4  3          1950     350
5  4          2000     650
6  5          2000     500
7  8          2000     500
8  8          2000     450

ties.method = "first" 没问题,最后我生成了这个数据框:

   idgeoville date    population  rank
1  5          1950     500        1
2  8          1950     450        2
3  4          1950     350        3
4  3          1950     350        4
5  4          2000     650        1
6  5          2000     500        2
7  8          2000     500        3
8  8          2000     450        4

但实际上,我想要一个具有同等人口排名的同等排名的数据框,如下所示:

   idgeoville date    population  rank
1  5          1950     500        1
2  8          1950     450        2
3  4          1950     350        3
4  3          1950     350        3
5  4          2000     650        1
6  5          2000     500        2
7  8          2000     500        2
8  8          2000     450        3

如何用 R 解决这个问题?使用自定义 ties.method() 或其他 R 技巧?

【问题讨论】:

  • 那么 ties = min, or max, or average... 他们都保持 tie 的排名相同。
  • 对于 min 和 x2 1 1 2 3
  • 或者,使用max 并从结果中减去平局数? 2 2 3 4-1=1 1 2 3。现在,问题是要弄清楚联系的数量......无论如何,我只是通过谷歌偶然发现了这个线程。

标签: sorting select r ranking dataframe


【解决方案1】:

更简单的方法:

pop.rank <- as.numeric(factor(population))

【讨论】:

  • 这仅使用 population 并忽略 OP 请求的 date。因此,它将为每个 date 创建一个整体排名,但不会创建一个单独的排名。
【解决方案2】:

我相信排名没有办法做到这一点;这是一个自定义函数,可以做你想做的事,但如果你的数据很大,它可能会太慢:

Rank<-function(d) {
    j<-unique(rev(sort(d)));
    return(sapply(d,function(dd) which(dd==j)));
}

【讨论】:

  • 非常感谢,没关系!但是,如果另一个人使用 R 包有更好和/或更快的解决方案,我会接受!
【解决方案3】:

这回答了一个稍微不同的问题,即如何根据多列对data.frame 对象进行排序。为此,您可以使用包reshape 中的函数sort_df

> library(reshape)
> sort_df(df,vars=c('date','population'))
  idgeoville date population
3          4 1950        350
4          3 1950        350
2          8 1950        450
1          5 1950        500
8          8 2000        450
6          5 2000        500
7          8 2000        500
5          4 2000        650

【讨论】:

  • 这不能回答问题。此外,population 按升序排序,而对于排名,我希望降序(最大在前)。
猜你喜欢
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多