関連する質問
この質問は非常に関連性がありますが、2年前のものです。Javaのメモリ内OLAPエンジン
バックグラウンド
与えられた表形式のデータセットから、メモリ内にピボットテーブルのような行列を作成したいと思います
たとえば、婚姻状況のカウントによる年齢(行は年齢、列は婚姻状況)。
入力:年齢といくつかのブールプロパティ(結婚しているなど)を含む人々のリスト、
必要な出力:年齢(行)およびisMarried(列)ごとの人数
私が試したこと(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
私は上記のコードが好きではありません、それは効率的ではなく、読みにくいです、そして私はより良い方法があると確信しています。
質問)
「両方」でgroupByするにはどうすればよいですか?各サブグループのカウントを行うにはどうすればよいですか。
ちょうど30歳で結婚している人は何人いますか?
もう1つの質問は、質問に答えるために、現在の合計をどのように行うかです。
30歳以上の人は何人結婚していますか?
編集:
すべての素晴らしい答えをありがとう。
明確にするために、次の列を持つ「テーブル」を出力に含めたいと思います
- 年齢(昇順)
- 既婚者数
- 未婚の数
- ランニングトータル既婚
- 未婚の累計
これらの特定の質問に答えるだけでなく、そのようなすべてのタイプの質問に答えることができるレポートを作成します。