# Dataframe transform operation on multiple columns

**URL:** <https://discourse.julialang.org/t/dataframe-transform-operation-on-multiple-columns/44529>\
**Category:** General Usage\
**Tags:** dataframes\
**Created:** [August 7, 2020, 11:14pm UTC](https://discourse.julialang.org/t/dataframe-transform-operation-on-multiple-columns/44529 "2020-08-07T23:14:47Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![danicaratelli](https://avatars.discourse-cdn.com/v4/letter/d/90db22/32.png) [@danicaratelli](https://discourse.julialang.org/u/danicaratelli)\
**Post date:** [August 7, 2020, 11:14pm UTC](https://discourse.julialang.org/t/dataframe-transform-operation-on-multiple-columns/44529/1 "2020-08-07T23:14:47Z")

</div>

Hello,

I am trying to use `transform` on multiple columns of a dataframe, that is I want apply an operation taking 2 variables as inputs, column1 and column2 and output the result.

A simple example would be:

```julia
df = DataFrame(A = 1:4, B = 1:4, C = 5:8);
transform!(df, :, [:B,:C] => (x,y) -> sumcols(x,y))

```

where `sumcols` just sums columns together, should give me a column that looks like:

[6;8;10;12];

Of course, in this case I can just do `.+`, but such a syntax would be useful in many scenarios. Any ideas how I can get this?

Thanks!

---

<div class="post-metadata">

**Author:** ![tbeason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tbeason/32/15898_2.png) [@tbeason](https://discourse.julialang.org/u/tbeason)\
**Post date:** [August 7, 2020, 11:30pm UTC](https://discourse.julialang.org/t/dataframe-transform-operation-on-multiple-columns/44529/2 "2020-08-07T23:30:31Z")

</div>

```julia
transform!(df, :, [:B,:C] => ByRow(+) => :newcolname)

```

---

<div class="post-metadata">

**Author:** ![danicaratelli](https://avatars.discourse-cdn.com/v4/letter/d/90db22/32.png) [@danicaratelli](https://discourse.julialang.org/u/danicaratelli)\
**Post date:** [August 7, 2020, 11:38pm UTC](https://discourse.julialang.org/t/dataframe-transform-operation-on-multiple-columns/44529/3 "2020-08-07T23:38:32Z")

</div>

Thank you, this works for what I ask originally. However, is there something that works more generally for any function fun(:B,:C) that outputs a vector of the appropriate size?

For example, say

```julia
function f(x,y)
    N = size(x,1);
    z = zeros(N);
    for i=1:N
          z[i] = maximum(x[i:end]) + minimum(y[i:end]);
    end
    return z
end

```

with the output:  
`[9;10;11;12];`

Thanks!

---

<div class="post-metadata">

**Author:** ![Henrique\_Becker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrique_becker/32/15443_2.png) [@Henrique\_Becker](https://discourse.julialang.org/u/Henrique_Becker)\
**Post date:** [August 7, 2020, 11:39pm UTC](https://discourse.julialang.org/t/dataframe-transform-operation-on-multiple-columns/44529/4 "2020-08-07T23:39:35Z")

</div>

Interesting, I did not know `ByRow` I was using a little more generic function I need in other contexts too.

```julia
broadwrap(f) = function (args...) broadcast(f, args...) end
transform!(df, [:B,:C] => broadwrap(+) => :D)

```

---

<div class="post-metadata">

**Author:** ![danicaratelli](https://avatars.discourse-cdn.com/v4/letter/d/90db22/32.png) [@danicaratelli](https://discourse.julialang.org/u/danicaratelli)\
**Post date:** [August 7, 2020, 11:54pm UTC](https://discourse.julialang.org/t/dataframe-transform-operation-on-multiple-columns/44529/5 "2020-08-07T23:54:57Z")

</div>

Yes, I get a similar limitation with your method as the one I mention in the previous response.

Thank you though!

---

<div class="post-metadata">

**Author:** ![tbeason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tbeason/32/15898_2.png) [@tbeason](https://discourse.julialang.org/u/tbeason)\
**Post date:** [August 8, 2020, 12:00am UTC](https://discourse.julialang.org/t/dataframe-transform-operation-on-multiple-columns/44529/6 "2020-08-08T00:00:13Z")

</div>

In that example you could do

```julia
transform!(df, :, [:B,:C] => (x,y) -> f(x,y))

```

and it will work. If the function works on vectors, you use this, if it is something you want to broadcast then you use `ByRow`.

---

<div class="post-metadata">

**Author:** ![tbeason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tbeason/32/15898_2.png) [@tbeason](https://discourse.julialang.org/u/tbeason)\
**Post date:** [August 8, 2020, 12:02am UTC](https://discourse.julialang.org/t/dataframe-transform-operation-on-multiple-columns/44529/7 "2020-08-08T00:02:41Z")

</div>

In fact, just for completeness, I’ll note that you can even be lazy in your original example and just do

```julia
transform!(df, :, [:B,:C] => +)

```

because `+` also works for vectors.

---

<div class="post-metadata">

**Author:** ![Henrique\_Becker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrique_becker/32/15443_2.png) [@Henrique\_Becker](https://discourse.julialang.org/u/Henrique_Becker)\
**Post date:** [August 8, 2020, 12:06am UTC](https://discourse.julialang.org/t/dataframe-transform-operation-on-multiple-columns/44529/8 "2020-08-08T00:06:04Z")

</div>

I have to admit that I am not understanding what limitation you are referring to.

---

<div class="post-metadata">

**Author:** ![danicaratelli](https://avatars.discourse-cdn.com/v4/letter/d/90db22/32.png) [@danicaratelli](https://discourse.julialang.org/u/danicaratelli)\
**Post date:** [August 8, 2020, 12:06am UTC](https://discourse.julialang.org/t/dataframe-transform-operation-on-multiple-columns/44529/9 "2020-08-08T00:06:45Z")

</div>

> [@tbeason](#):
>
> `=> :newcolname`

This is perfect! Thanks!

---

<div class="post-metadata">

**Author:** ![danicaratelli](https://avatars.discourse-cdn.com/v4/letter/d/90db22/32.png) [@danicaratelli](https://discourse.julialang.org/u/danicaratelli)\
**Post date:** [August 8, 2020, 12:07am UTC](https://discourse.julialang.org/t/dataframe-transform-operation-on-multiple-columns/44529/10 "2020-08-08T00:07:50Z")

</div>

Yes, sorry, was not clear. Yours, at least as I applied it, was for row-by-row operations, what @tbeason has here:

```julia
transform!(df, :, [:B,:C] => (x,y) -> f(x,y))

```

works for what I intended.

Thanks!

---

<div class="post-metadata">

**Author:** ![Henrique\_Becker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrique_becker/32/15443_2.png) [@Henrique\_Becker](https://discourse.julialang.org/u/Henrique_Becker)\
**Post date:** [August 8, 2020, 12:18am UTC](https://discourse.julialang.org/t/dataframe-transform-operation-on-multiple-columns/44529/11 "2020-08-08T00:18:21Z")

</div>

…

1. Yes. My `broadwrap` function was for row-by-row operations, this is because the `transform!` method already works out-of-the-box for operations directly over the vectors (instead of row-by-row).
2. You do not need to do `transform!(df, :, [:B,:C] => (x,y) -> f(x,y))`, you can just `transform!(df, [:B,:C] => f)`, `f` is already a function, and I am not sure why the colon would be needed.
