相关问题
这个问题非常相关,但已有 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岁以上结婚的有多少?
编辑:
谢谢你所有的好答案。
只是为了澄清,我希望输出包含一个带有以下列的“表”
- 年龄(升序)
- 已婚
- 未婚人数
- 运行总已婚
- 跑步总未婚
不仅要回答这些特定的查询,还要生成一份报告,以便回答所有此类问题。