我有一个数据框,我想使用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|
+--------+-----------+-------------+-----+----+
...进入此数据框:
+--------+-----------+-------------+-----+-------+
|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
?
谢谢!
答案 0 :(得分:0)
感谢Andrew's Ray answer至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)")