0

我搜索了最好的方法(我没有在当前的 api 中找到它,但也许我弄错了)来计算像 IndexedSeq 这样的 scala 集合的不同类型的排名(就像 R 中的不同策略:http: //stat.ethz.ch/ R-manual/R-devel/library/base/html/rank.html )

val tabToRank = IndexedSeq(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5)

例如,“第一级策略”等于先出现获胜,返回

tabToRank.rank("first")
# return (4,1,6,2,7,11,3,10,8,5,9)

例如,我有一个研究案例:如果您有一个tabToRank在模拟的最终状态下具有人口(矢量数据,如)的城市列表,我需要 a)排名和 b)按排名对城市进行排序以绘制类似“城市人口排名“等于众所周知的排名大小分布(img的src):

秩大小分布

4

2 回答 2

2

对于城市数据,您想要

citipop.sortBy(x => -x).zipWithIndex.map(_.swap)

首先对最大的人口进行排序(默认是最小的,所以我们对负数进行排序),然后对它们进行编号,然后首先获得数字,然后获得人口。

然而,Scala 没有内置的统计库。一般来说,你必须知道你想做什么,然后自己去做,或者使用一个Java库(例如Apache Commons Math)。

于 2012-10-11T14:51:55.190 回答
1

这是一个片段代码,它可以执行您给出的示例:

object Rank extends App {
  val tabToRank = IndexedSeq(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5);

  def rank[A](input: Seq[A])(implicit ord: Ordering[A]): Seq[Int] = {
    // transform to a pair of value/index
    val withIndices: Seq[(A,Int)] = input.zipWithIndex;
    // sort by the values
    val sorted: Seq[(A,Int)] = withIndices.sortBy(_._1);
    // keep only the indices
    val indices = sorted.map(_._2);
    // create the inverse permutation
    val r = new collection.mutable.ArraySeq[Int](indices.size);
    for((i,j) <- indices.zipWithIndex)
      r(i) = j;
    return r;
  }

  println(rank(tabToRank));
}

它:

  • 用它们的索引注释元素,
  • 根据值对其进行排序
  • 丢弃值,只保留索引
  • 并反转排列以获得您需要的地图。

(请注意,它从 0 开始计数,而不是从 1 开始计数,基本上所有编程语言都这样做。)

我不了解将其包含在内的其他内容(策略)。

于 2012-10-11T15:11:06.610 回答