Группировать по списку - PullRequest
       3

Группировать по списку

0 голосов
/ 23 апреля 2020

У меня есть список из 5 элементов

data = List((List(c1),Y), (List(c1),N), (List(c1),N), (List(c1),Y), (List(c1),Y))

И я хочу создать следующий список:

List((List(c1),Y,0.666), (List(c1),N),0.333)

Какие-нибудь советы о том, как лучше всего это сделать?

Я использую scala, если это поможет

Ответы [ 3 ]

0 голосов
/ 23 апреля 2020
  def calculatePercentages(data : List[(List[String], String)]): List[((List[String], String),BigDecimal)] = {
    val (yesRows, noRows) = data.partition(_._2 == "Y")
    List((yesRows(0), (BigDecimal(yesRows.length) / BigDecimal(data.length)).setScale(3, BigDecimal.RoundingMode.HALF_UP)),
      (noRows(0), (BigDecimal(noRows.length) / BigDecimal(data.length)).setScale(3, BigDecimal.RoundingMode.HALF_UP)))
  }

scala> calculatePercentages(data)
res30: List[((List[String], String), BigDecimal)] = List(((List(c1),Y),0.600), ((List(c1),N),0.400))
0 голосов
/ 24 апреля 2020

Большое спасибо за вашу поддержку. Ваш код работает правильно по моему первому запросу. Однако, с более сложными данными, как со списком ниже, это не так, как я ожидал.

    List(
(List(c1, a1),Y),
(List(a1),Y), 
(List(c1, a1),N),
(List(a1),N),
(List(a1),Y))

, и я хочу, чтобы результат был

List(
(List(c1, a1),Y, 0.5),
(List(c1, a1),N, 0.5),
(List(a1),Y, 0.66), 
(List(a1),N, 0.33),
)

Я с нетерпением жду вашей поддержки

0 голосов
/ 23 апреля 2020
object Grouping {

  def main(args: Array[String]): Unit = {
    val data = List((List("c1"),"Y"), (List("c1"),"N"), (List("c1"),"N"), (List("c1"),"Y"), (List("c1"),"Y"))

    val result = data.groupBy(grp => (grp._1,grp._2))
      .mapValues(count =>  BigDecimal(count.size.toDouble).setScale(3)./(BigDecimal(data.size.toDouble).setScale(3))
        .setScale(3, BigDecimal.RoundingMode.HALF_UP))
        .map( k => (k._1._1,k._1._2,k._2)).toList
    println("result=="+result)
  }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...