# Performing multiple melt/stack operations on a dataset simultaneously

**URL:** https://discourse.julialang.org/t/performing-multiple-melt-stack-operations-on-a-dataset-simultaneously/8947
**Category:** Data
**Created:** [February 9, 2018, 12:52pm UTC](https://discourse.julialang.org/t/performing-multiple-melt-stack-operations-on-a-dataset-simultaneously/8947 "2018-02-09T12:52:19Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![Raf](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raf/32/3383_2.png) [@Raf](https://discourse.julialang.org/u/Raf)
#### Post date: [February 9, 2018, 12:52pm UTC](https://discourse.julialang.org/t/performing-multiple-melt-stack-operations-on-a-dataset-simultaneously/8947/1 "2018-02-09T12:52:19Z")

</div>

I’m importing some R data so decided to learn DataFrames manipulation in julia instead of doing it in R. I have a wide dataframe with some initial columns followed by four variables that span 12 columns, one for each month. I want them in long format arranged with month as a column. I used `stack()` to successfully transform for the first monthly variable from 12 columns to 12 rows with:

`df = stack(df, 5:16)`

Then I tried to do all of the 12 column blocks simultaneously with:

`df = stack(df, [5:16, 17:28, 29:40, 41:52])`

but there was no method defined for an array of ranges.

Any ideas about a similarly powerful way to do multiple stack operations at the same time?

---

<div class="post-metadata">

### Author: ![nalimilan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nalimilan/32/147_2.png) [@nalimilan](https://discourse.julialang.org/u/nalimilan)
#### Post date: [February 9, 2018, 1:20pm UTC](https://discourse.julialang.org/t/performing-multiple-melt-stack-operations-on-a-dataset-simultaneously/8947/2 "2018-02-09T13:20:08Z")

</div>

Use `[5:16; 17:28; 29:40; 41:52]` instead. With commas, you create an array of ranges instead of an array of integers.

---

<div class="post-metadata">

### Author: ![Raf](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raf/32/3383_2.png) [@Raf](https://discourse.julialang.org/u/Raf)
#### Post date: [February 10, 2018, 5:42am UTC](https://discourse.julialang.org/t/performing-multiple-melt-stack-operations-on-a-dataset-simultaneously/8947/3 "2018-02-10T05:42:00Z")

</div>

Thanks! that does transform all columns ranges at once, but it appends each set of columns into the same two variable/value columns, not multiple sets of variable/value columns in the same rows. I guess I was expecting too much power built in, it’s probably not even possible in R! Maybe I’ll write a pull request that allows the comma syntax for multiple stacks in the same rows.

---

<div class="post-metadata">

### Author: ![bkamins](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bkamins/32/208538_2.png) [@bkamins](https://discourse.julialang.org/u/bkamins)
#### Post date: [February 10, 2018, 6:38am UTC](https://discourse.julialang.org/t/performing-multiple-melt-stack-operations-on-a-dataset-simultaneously/8947/4 "2018-02-10T06:38:57Z")

</div>

Is this what you want (assuming that `[:x1,:x2,:x3,:x4]` are names of variables you do not want to stack)?

```
reduce((x,y) -> join(x,y,on=[:x1,:x2,:x3,:x4], makeunique=true), getindex.(stack.(x, [5:16, 17:28, 29:40, 41:52]),[1:6]))

```

alternatively you can drop those not-stacked variables if you do not need them:

```
hcat(getindex.(stack.(x, [5:16, 17:28, 29:40, 41:52]),[1:2])..., makeunique=true)

```

---

<div class="post-metadata">

### Author: ![bramtayl](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bramtayl/32/3614_2.png) [@bramtayl](https://discourse.julialang.org/u/bramtayl)
#### Post date: [February 10, 2018, 6:56am UTC](https://discourse.julialang.org/t/performing-multiple-melt-stack-operations-on-a-dataset-simultaneously/8947/5 "2018-02-10T06:56:34Z")

</div>

Unless your really pressed for performance, the easiest way is to stack the months then spread the 4 variables. Are the column names something like `var_1_month_2` so that you can split out a separate column for month?

---

<div class="post-metadata">

### Author: ![Raf](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raf/32/3383_2.png) [@Raf](https://discourse.julialang.org/u/Raf)
#### Post date: [February 16, 2018, 9:18am UTC](https://discourse.julialang.org/t/performing-multiple-melt-stack-operations-on-a-dataset-simultaneously/8947/6 "2018-02-16T09:18:54Z")

</div>

Thanks the reduce/join approach looks good.
