【问题标题】:How to find the combination count in scala?如何在scala中找到组合计数?
【发布时间】:2015-09-17 16:39:52
【问题描述】:

我的数据集包含 5 列,最后一列作为类索引。我想要每列与该类索引值的组合。

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

我想要组合 Sunny & yes = 0,sunny & no = 2,阴天 & yes = 1,rainy & yes = 2。

【问题讨论】:

标签: scala


【解决方案1】:

将每一行收集到具有 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"

【讨论】:

    【解决方案2】:

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

    想象它是一个列表,你可以试试这样的:

    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))
    

    一旦你的元素用“yes”/“no”类限定,你就可以对你的出现进行分组并计算每个组的元素数量:

    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))
    

    【讨论】:

    • 我更改了我的数据集。所以最后一列是 classindex 列。我希望每一列都有不同的值与 classindex 与 count 组合
    • 在 RDD 而不是 List 上相同,我们如何进行组合
    猜你喜欢
    • 2020-11-26
    • 2021-05-09
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    相关资源
    最近更新 更多