繁体   English   中英

Scala-元组的枢轴序列到表格形式

[英]Scala - Pivot sequence of Tuples to table form

我有一个元组序列,它很可能是通过对一组记录进行分组而生成的列表列表,例如

[
    ["2017-01","Banking",25000000],
    ["2017-02","Banking",10000000],
    ["2017-02","Telecoms",12500000],
    ["2017-03","FCMG",22500000],
    ["2017-04","FCMG 2",17500000],
    ["2017-05","FCMG 2",5000000]
]

这是通过按格式日期,扇区将一些记录分组并取一些值的总和而生成的。 我想以矩阵样式显示此值,如下所示:

         | 2017-01 | 2017-02 | 2017-03 | 2017-04 | 2017-05 |
------------------------------------------------------------
Banking  | 25000000|10000000 | 0       | 0       | 0
------------------------------------------------------------
Telecoms | 0       |12500000 | 0       | 0       | 0
------------------------------------------------------------
FCMG     | 0       | 0       |22500000 | 0       | 0
------------------------------------------------------------
FCMG 2   | 0       | 0       | 0       | 17500000| 5000000
------------------------------------------------------------

为此,我想将第一个数据结构转换为以下形式:

[
    ["Banking", 25000000, 10000000, 0, 0, 0]
    ["Telecoms", 0, 12500000, 0, 0, 0],
    ["FCMG", 0, 0, 22500000, 0, 0],
    ["FCMG 2",0, 0, 0, 17500000, 5000000]
]

在扇区后的5个数字分别代表每个日期的对应值而没有对应值的0处,我该如何实现呢? 或者可能

[
    {"Banking" -> (25000000, 10000000, 0, 0, 0)}
    {"Telecoms" -> (0, 12500000, 0, 0, 0)},
    {"FCMG" -> (0, 0, 22500000, 0, 0)},
    {"FCMG 2" -> (0, 0, 0, 17500000, 5000000)}
]

您可以按照以下步骤操作数据:

  1. 创建不同的yearMonths的排序列表
  2. 创建一个以industres为键的元组图
  3. 使用foldLeft将地图值扩展为按industries划分的年月列的单独列表
  4. 使用reducezipindustries逐个汇总列表

这是一个例子:

val data = Seq(
  ("2017-01","Banking",25000000),
  ("2017-02","Banking",10000000),
  ("2017-02","Telecoms",12500000),
  ("2017-03","FCMG",22500000),
  ("2017-04","FCMG 2",17500000),
  ("2017-05","FCMG 2",5000000)
)

val yearMonths = data.map(_._1).distinct.sorted
// yearMonths: Seq[String] = List(2017-01, 2017-02, 2017-03, 2017-04, 2017-05)

val pivotedMap = data.groupBy(_._2).mapValues( _.map( x =>
  yearMonths.foldLeft( Seq[Int]() )( (list, ym) =>
    if (ym == x._1) list :+ x._3 else list :+ 0
  )
)).mapValues( _.reduce(
  (a, e) => (a, e).zipped.map(_ + _)
))

// pivotedMap: scala.collection.immutable.Map[String,Seq[Int]] = Map(
//   Telecoms -> List(0, 12500000, 0, 0, 0),
//   Banking -> List(25000000, 10000000, 0, 0, 0),
//   FCMG -> List(0, 0, 22500000, 0, 0),
//   FCMG 2 -> List(0, 0, 0, 17500000, 5000000)
// )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM