首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >相当于R的重塑2::熔体()在Scala?

相当于R的重塑2::熔体()在Scala?
EN

Stack Overflow用户
提问于 2018-01-11 23:33:23
回答 1查看 840关注 0票数 0

我有一个数据框架,我希望使用Scala将行分解为多个行,使用多列中的值。理想情况下,我希望复制R函数melt()的行为。

所有列都包含Strings

我想转换这个数据帧..。

代码语言:javascript
运行
复制
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此数据框架:

代码语言:javascript
运行
复制
+--------+-----------+-------------+-----+-------+
|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 |
+--------+-----------+-------------+-----+-------+
  • Scala中是否有适用于数据集或数据帧的内置函数来执行此操作?
  • 如果不是,实施起来是否相对简单呢?如何在高层次上做到这一点?

注意:我找到了SMV中的UnpivotOp类,它完全可以做我想做的事情:(https://github.com/TresAmigosSD/SMV/blob/master/src/main/scala/org/tresamigos/smv/UnpivotOp.scala)。

不幸的是,这个类是私有的,所以我不能这样做:

代码语言:javascript
运行
复制
import org.tresamigos.smv.UnpivotOp
val melter = new UnpivotOp(df,  Seq("res1","res2"))
val melted_df = melter.unpivot()

有没有人知道是否有一种方法可以通过SMV的其他静态方法来访问org.tresamigos.smv.UnpivotOp类?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-11 23:48:11

多亏了Andrew's Ray answer to unpivot in spark-sql/pyspark这样做了:

代码语言:javascript
运行
复制
df.select($"col1",
          $"col2",
          $"col3",
          expr("stack(2, 'res1', res1, 'res2', res2) as (key, value)"))

或者如果select的表达式应该作为字符串传递(对于df %>% sparklyr::invoke("")方便):

代码语言:javascript
运行
复制
df.selectExpr("col1", 
              "col2", 
              "col3",
              "stack(2, 'res1', res1, 'res2', res2) as (key, value)")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48217468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档