# \[ANN\] DataFramesMeta 0.10.0 release

**URL:** https://discourse.julialang.org/t/ann-dataframesmeta-0-10-0-release/69903
**Category:** Data
**Tags:** announcement
**Created:** [October 16, 2021, 4:38pm UTC](https://discourse.julialang.org/t/ann-dataframesmeta-0-10-0-release/69903 "2021-10-16T16:38:53Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![pdeffebach](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pdeffebach/32/10320_2.png) [@pdeffebach](https://discourse.julialang.org/u/pdeffebach)
#### Post date: [October 16, 2021, 4:38pm UTC](https://discourse.julialang.org/t/ann-dataframesmeta-0-10-0-release/69903/1 "2021-10-16T16:38:53Z")

</div>

We are pleased to announce the release of DataFramesMeta.jl version `0.10.0`.

This release adds the `@astable` macro-flag, which is similar to the `@t` macro-flag in DataFrameMacros.jl. Thanks to @jules for taking initiating the work on this feature.

When the `@astable` macro-flag is used, new columns can be created at any point in a the block of transformations, interspersed with non-transformation expressions, and you can create multiple columns which depend on one another. The syntax `:y = ...`, which errors outside of DataFramesMeta.jl with `@astable`, is used to create new columns.

```julia
julia> using DataFramesMeta

julia> df = DataFrame(a = [1, 2], b = [3, 4])
2×2 DataFrame
 Row │ a b     
     │ Int64 Int64 
─────┼──────────────
   1 │ 1 3
   2 │ 2 4

julia> @rtransform df @astable begin 
           :c_1 = :a
           z = 1 + :a # no new column created
           :c_2 = :c_1 * 100
           :c_3 = :b + 10
       end
2×5 DataFrame
 Row │ a b c_1 c_2 c_3   
     │ Int64 Int64 Int64 Int64 Int64 
─────┼───────────────────────────────────
   1 │ 1 3 1 100 13
   2 │ 2 4 2 200 14

```

As in the rest of DataFramesMeta.jl, escaping with `$` can be used to create variables programatically

```julia
julia> x_str = "x";

julia> @rtransform df @astable begin 
           $x_str = :a + :b
           :z = $x_str * 100
       end
2×4 DataFrame
 Row │ a b x z     
     │ Int64 Int64 Int64 Int64 
─────┼────────────────────────────
   1 │ 1 3 4 400
   2 │ 2 4 6 600

```

This is a breaking release, which is unfortunate because there have been many breaking releases recently in DataFramesMeta.jl. In implementing this feature, We had to finally disallow an already-deprecated feature. `@combine df (x1 = first(:a), x2 = first(:b))` used to create new columns `:x1` and `:x2`. This syntax is now disallowed with two possible alternatives

For preserving the named-tuple outcome, which is best when the named tuple is a result of a function and not typed out literally.

```julia
julia> function foo(a, b)
           (x1 = first(a), x2 = first(b))
       end;

julia> @combine df $AsTable = foo(:a, :b)
1×2 DataFrame
 Row │ x1 x2    
     │ Int64 Int64 
─────┼──────────────
   1 │ 1 3

```

using the new `@astable` macro when you are working with the expression literally

```julia

julia> @combine df @astable begin
           :x1 = first(:a)
           :x2 = first(:b)
       end
1×2 DataFrame
 Row │ x1 x2    
     │ Int64 Int64 
─────┼──────────────
   1 │ 1 3

```
