[英]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)}
]
您可以按照以下步骤操作数据:
yearMonths
的排序列表 industres
为键的元组图 foldLeft
将地图值扩展为按industries
划分的年月列的单独列表 reduce
和zip
按industries
逐个汇总列表 这是一个例子:
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.