如何在 Scala 中像计数一样进行聚合

How to make aggregation like count in scala

你好,

我一直坚持使用 scala 中的集合。我有一个这样的列表:

val a2 = List(("C",2.0,288,1978),
  ("C",2.5,307,1978),
  ("C",3.0,312,1978),
  ("C",2.5,377,1978),
  ("C",1.0,571,1978),
  ("H"," ",288,1978),
    ("H",2.5,307, 1978),
  ("A",4.0,187,2003),
  ("A",3.0,260, 2003))

我的目标是使用具有第 1 和第 4 个值(流派和年份)的分组依据并计算第 2 和第 3 个值。然后,应添加一个新列以构成 count_2nd/count_3rd。最后的样子应该是这样的:

C, 1978 -> 5, 5 , 1.0
H, 1978 -> 1, 2, 0.5
A, 2003 -> 2, 2, 1.0

我试过了:

a2.flatMap(row => row._2.map( nm => (row._1,nm.rating,nm.userId,row._3))) 

但 IDE 不允许添加类似 .count(i => i._2) 的内容。我想我做这件事的方式很糟糕。

数据中也应该有空值,在第6行数据中有一个空值。通过考虑空值,我希望在 count_2nd/count_3rd.

中有一些不同的值

在 scala 中是否可行,如果可行,我将不胜感激:)

如果您需要分组依据 - 使用分组依据:

val a2: List[(String, Double, Int, Option[Int])] = List(("Comedy", 2.0, 288, Some(1978)),
    ("Comedy", 2.5, 307, Some(1978)),
    ("Comedy", 3.0, 312, Some(1978)),
    ("Comedy", 2.5, 377, Some(1978)),
    ("Comedy", 1.0, 571, Some(1978)),
    ("Horror", Double.NaN, 288, Some(1978)),
    ("Horror", 2.5, 307, Some(1978)),
    ("Adventure", 4.0, 187, Some(2003)),
    ("Adventure", 3.0, 260, Some(2003)))

val result = a2.groupBy(t => (t._1, t._4))
    .view
    .mapValues(lst => (lst.filter(!_._2.isNaN).length, lst.filter(!_._3.isNaN).length)) // transform grouping into tuple with needed counts 
    .mapValues(t => (t._1, t._2, t._1.toFloat / t._2)) // "add" 3rd column
    .toMap

println(result) // prints Map((Horror,Some(1978)) -> (1,2,0.5), (Comedy,Some(1978)) -> (5,5,1.0), (Adventure,Some(2003)) -> (2,2,1.0))