【发布时间】:2012-10-10 09:50:27
【问题描述】:
相关问题
这个问题很相关,但已经2岁了:In memory OLAP engine in Java
背景
我想在内存中从给定的表格数据集创建一个类似于数据透视表的矩阵
例如按婚姻状况计数的年龄(行是年龄,列是婚姻状况)。
输入:人员列表,包括年龄和一些布尔属性(例如已婚),
期望的输出:人数,按年龄(行)和已婚(列)
我尝试过的 (Scala)
case class Person(val age:Int, val isMarried:Boolean)
...
val people:List[Person] = ... //
val peopleByAge = people.groupBy(_.age) //only by age
val peopleByMaritalStatus = people.groupBy(_.isMarried) //only by marital status
我设法以幼稚的方式做到这一点,首先按年龄分组,然后map 按婚姻状况进行count,并输出结果,然后我将foldRight 汇总
TreeMap(peopleByAge.toSeq: _*).map(x => {
val age = x._1
val rows = x._2
val numMarried = rows.count(_.isMarried())
val numNotMarried = rows.length - numMarried
(age, numMarried, numNotMarried)
}).foldRight(List[FinalResult]())(row,list) => {
val cumMarried = row._2+
(if (list.isEmpty) 0 else list.last.cumMarried)
val cumNotMarried = row._3 +
(if (list.isEmpty) 0 else l.last.cumNotMarried)
list :+ new FinalResult(row._1, row._2, row._3, cumMarried,cumNotMarried)
}.reverse
我不喜欢上面的代码,效率不高,难以阅读,我相信还有更好的方法。
问题
如何按“两者”分组?以及如何对每个子组进行计数,例如
有多少人正好 30 岁结婚?
还有一个问题,我怎么做一个累计,来回答这个问题:
30岁以上结婚的人有多少?
编辑:
感谢您提供的所有精彩答案。
为了澄清,我希望输出包含一个带有以下列的“表格”
- 年龄(升序)
- Num 结婚了
- Num 未婚
- 跑步总结婚
- 跑步总未婚
不仅要回答这些特定的问题,还要生成一份报告,以便回答所有此类问题。
【问题讨论】:
标签: scala data-structures olap