我有一个数据框架,我希望使用Scala将行分解为多个行,使用多列中的值。理想情况下,我希望复制R函数melt()的行为。
所有列都包含Strings。
我想转换这个数据帧..。
df.show
+--------+-----------+-------------+-----+----+
|col1 | col2 | col3 | res1|res2|
+--------+-----------+-------------+-----+----+
| a| baseline| equivalence| TRUE| 0.1|
| a| experiment1| equivalence|FALSE|0.01|
| b| baseline| equivalence| TRUE| 0.2|
| b| experiment1| equivalence|FALSE|0.02|
+--------+-----------+-------------+-----+----+...Into此数据框架:
+--------+-----------+-------------+-----+-------+
|col1 | col2 | col3 | key |value|
+--------+-----------+-------------+-----+-------+
| a| baseline| equivalence| res1 | TRUE |
| a|experiment1| equivalence| res1 | FALSE|
| b| baseline| equivalence| res1 | TRUE |
| b|experiment1| equivalence| res1 | FALSE|
| a| baseline| equivalence| res2 | 0.1 |
| a|experiment1| equivalence| res2 | 0.01 |
| b| baseline| equivalence| res2 | 0.2 |
| b|experiment1| equivalence| res2 | 0.02 |
+--------+-----------+-------------+-----+-------+注意:我找到了SMV中的UnpivotOp类,它完全可以做我想做的事情:(https://github.com/TresAmigosSD/SMV/blob/master/src/main/scala/org/tresamigos/smv/UnpivotOp.scala)。
不幸的是,这个类是私有的,所以我不能这样做:
import org.tresamigos.smv.UnpivotOp
val melter = new UnpivotOp(df, Seq("res1","res2"))
val melted_df = melter.unpivot()有没有人知道是否有一种方法可以通过SMV的其他静态方法来访问org.tresamigos.smv.UnpivotOp类?
谢谢!
发布于 2018-01-11 23:48:11
多亏了Andrew's Ray answer to unpivot in spark-sql/pyspark这样做了:
df.select($"col1",
$"col2",
$"col3",
expr("stack(2, 'res1', res1, 'res2', res2) as (key, value)"))或者如果select的表达式应该作为字符串传递(对于df %>% sparklyr::invoke("")方便):
df.selectExpr("col1",
"col2",
"col3",
"stack(2, 'res1', res1, 'res2', res2) as (key, value)")https://stackoverflow.com/questions/48217468
复制相似问题