如何在scala中找到组合计数?

时间:2015-09-17 06:15:30

标签: scala

我的数据集包含5列,最后一列为classindex。我想要每个列与该classindex值的组合。

"sunny", "hot", "high", "false","no"
"sunny", "hot", "high", "true","no"
"overcast", "hot", "high", "false","yes"
"rainy", "mild", "high", "false","yes"

我希望阳光和阳光的组合;是= 0,晴天& no = 2,阴&是= 1,多雨&是= 2。

2 个答案:

答案 0 :(得分:0)

您的数据集的描述对我来说似乎有点模糊,但是,您使用哪种数据结构来表示它?

想象一下,这是一个列表,您可以尝试类似:

l =>  (l.head, l.last)

将此应用于整个集合:

val dataset = List(
    "sunny"::"hot"::"high"::"no"::Nil,
    "sunny"::"hot"::"high"::"no"::Nil,
    "overcast"::"hot"::"high"::"yes"::Nil,
    "rainy"::"mild"::"high"::"yes"::Nil
)

val qualified = dataset.map(l => (l.head, l.last))

一旦您的元素符合“是”/“否”类,您就可以对事件进行分组并计算每组元素的数量:

val countMap = qualified.groupBy(x => x).map(kv => (kv._1, kv._2.size))

或更短的形式:

val countMap = qualified.groupBy(x => x).mapValues(_.size)

为了列出所有可能性,即使它们的计数为0,您也可以生成所有可能的组合并使用地图查找每个计数值:

(
    for(
        st <- dataset.map(_.head).toSet[String];
        q  <- dataset.map(_.last).toSet[String]
       ) yield (st,q)
).map(k => (k, countMap.getOrElse(k,0)))

> Set(((rainy,no),0), ((sunny,yes),0), ((sunny,no),2), ((rainy,yes),1), ((overcast,yes),1), ((overcast,no),0))

答案 1 :(得分:0)

将每一行收集到一个包含5个属性

的案例类Weather
case class Weather(p1: String, p2: String, p3: String, p4: String, p5: String)

等等

val xs = Array(
  Weather("sunny", "hot", "high", "false","no"),
  Weather("sunny", "hot", "high", "true","no"),
  Weather("overcast", "hot", "high", "false","yes"),
  Weather("rainy", "mild", "high", "false","yes"))

按照第一个和最后一个属性对条目进行分组,然后计算分组实例的数量,例如像这样,

xs.groupBy( w => (w.p1,w.p5) ).mapValues(_.size)

提供

Map((overcast,yes) -> 1, (sunny,no) -> 2, (rainy,yes) -> 1)

但是,此方法不考虑missing或未声明的群组,例如"sunny""yes"