[英]R SparkR - equivalent to melt function
SparkR庫中是否有類似於melt
的功能?
將1行50列的數據轉換為50行3列的數據?
SparkR中沒有提供類似功能的內置功能。 您可以用explode
建立自己的
library(magrittr)
df <- createDataFrame(data.frame(
A = c('a', 'b', 'c'),
B = c(1, 3, 5),
C = c(2, 4, 6)
))
melt <- function(df, id.vars, measure.vars,
variable.name = "key", value.name = "value") {
measure.vars.exploded <- purrr::map(
measure.vars, function(c) list(lit(c), column(c))) %>%
purrr::flatten() %>%
(function(x) do.call(create_map, x)) %>%
explode()
id.vars <- id.vars %>% purrr::map(column)
do.call(select, c(df, id.vars, measure.vars.exploded)) %>%
withColumnRenamed("key", variable.name) %>%
withColumnRenamed("value", value.name)
}
melt(df, c("A"), c("B", "C")) %>% head()
A key value
1 a B 1
2 a C 2
3 b B 3
4 b C 4
5 c B 5
6 c C 6
或將SQL與Hive的stack
UDF結合使用:
stack <- function(df, id.vars, measure.vars,
variable.name = "key", value.name = "value") {
measure.vars.exploded <- glue::glue('"{measure.vars}", `{measure.vars}`') %>%
glue::glue_collapse(" , ") %>%
(function(x) glue::glue(
"stack({length(measure.vars)}, {x}) as ({variable.name}, {value.name})"
)) %>%
as.character()
do.call(selectExpr, c(df, id.vars, measure.vars.exploded))
}
stack(df, c("A"), c("B", "C")) %>% head()
A key value
1 a B 1
2 a C 2
3 b B 3
4 b C 4
5 c B 5
6 c C 6
相關問題:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.