# Help in sum columns

**URL:** <https://discourse.julialang.org/t/help-in-sum-columns/77883>\
**Category:** New to Julia\
**Tags:** question, dataframes, sum\
**Created:** [March 14, 2022, 5:36pm UTC](https://discourse.julialang.org/t/help-in-sum-columns/77883 "2022-03-14T17:36:35Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![folleyz](https://avatars.discourse-cdn.com/v4/letter/f/977dab/32.png) [@folleyz](https://discourse.julialang.org/u/folleyz)\
**Post date:** [March 14, 2022, 5:36pm UTC](https://discourse.julialang.org/t/help-in-sum-columns/77883/1 "2022-03-14T17:36:35Z")

</div>

Hi everybody! I’m new in Julia and need a simple help.

I want to sum some columns of my dataframe and input that sum in a new column, but i’m trying with this and are not working.

```julia
colunasSum = [:CancIncorreto,:DifColetado,:FaltaCancelado,:FaltaPersonalizado,:QuebraCaixa] 
transform(df_pronto, colunasSum .=> sum => :Valor_desconto)

ArgumentError: duplicate output column name: :Valor_desconto

Stacktrace:
  [1] select_transform!(::Base.RefValue{Any}, df::DataFrame, newdf::DataFrame, transformed_cols::Set{Symbol}, copycols::Bool, allow_resizing_newdf::Base.RefValue{Bool}, column_to_copy::BitVector)
    @ DataFrames C:\Users\Pedro Henrique\.julia\packages\DataFrames\MA4YO\src\abstractdataframe\selection.jl:821
  [2] _manipulate(df::DataFrame, normalized_cs::Vector{Any}, copycols::Bool, keeprows::Bool)
    @ DataFrames C:\Users\Pedro Henrique\.julia\packages\DataFrames\MA4YO\src\abstractdataframe\selection.jl:1621
  [3] manipulate(::DataFrame, ::Any, ::Vararg{Any}; copycols::Bool, keeprows::Bool, renamecols::Bool)
    @ DataFrames C:\Users\Pedro Henrique\.julia\packages\DataFrames\MA4YO\src\abstractdataframe\selection.jl:1541

```

I need to sum the values of that columns to create a new one with the sum of them.

How can i accomplish that?

Thx!

---

<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:** [March 14, 2022, 5:54pm UTC](https://discourse.julialang.org/t/help-in-sum-columns/77883/2 "2022-03-14T17:54:57Z")

</div>

Do you want to sum rows or do you want a single number?

Here are the ways to produce both:

```julia
julia> df = DataFrame(rand(5, 4), :auto)
5×4 DataFrame
 Row │ x1 x2 x3 x4
     │ Float64 Float64 Float64 Float64
─────┼─────────────────────────────────────────
   1 │ 0.428323 0.757593 0.31246 0.640604
   2 │ 0.633038 0.169417 0.528082 0.669834
   3 │ 0.0376092 0.786284 0.399867 0.720137
   4 │ 0.673165 0.66684 0.437688 0.35086
   5 │ 0.614091 0.682412 0.511448 0.495272

julia> transform(df, [:x1, :x2, :x3, :x4] => (+) => :sum_of_rows)
5×5 DataFrame
 Row │ x1 x2 x3 x4 sum_of_rows
     │ Float64 Float64 Float64 Float64 Float64
─────┼──────────────────────────────────────────────────────
   1 │ 0.428323 0.757593 0.31246 0.640604 2.13898
   2 │ 0.633038 0.169417 0.528082 0.669834 2.00037
   3 │ 0.0376092 0.786284 0.399867 0.720137 1.9439
   4 │ 0.673165 0.66684 0.437688 0.35086 2.12855
   5 │ 0.614091 0.682412 0.511448 0.495272 2.30322

julia> transform(df, [:x1, :x2, :x3, :x4] => ((v...) -> sum(+(v...))) => :total_sum)
5×5 DataFrame
 Row │ x1 x2 x3 x4 total_sum
     │ Float64 Float64 Float64 Float64 Float64
─────┼────────────────────────────────────────────────────
   1 │ 0.428323 0.757593 0.31246 0.640604 10.515
   2 │ 0.633038 0.169417 0.528082 0.669834 10.515
   3 │ 0.0376092 0.786284 0.399867 0.720137 10.515
   4 │ 0.673165 0.66684 0.437688 0.35086 10.515
   5 │ 0.614091 0.682412 0.511448 0.495272 10.515

```

However, since you are struggling maybe using DataFramesMeta.jl will be easier for you:

```julia
julia> using DataFramesMeta

julia> @transform(df, :sum_of_rows = :x1 + :x2 + :x3 + :x4)
5×5 DataFrame
 Row │ x1 x2 x3 x4 sum_of_rows
     │ Float64 Float64 Float64 Float64 Float64
─────┼──────────────────────────────────────────────────────
   1 │ 0.428323 0.757593 0.31246 0.640604 2.13898
   2 │ 0.633038 0.169417 0.528082 0.669834 2.00037
   3 │ 0.0376092 0.786284 0.399867 0.720137 1.9439
   4 │ 0.673165 0.66684 0.437688 0.35086 2.12855
   5 │ 0.614091 0.682412 0.511448 0.495272 2.30322

julia> @transform(df, :total_sum = sum(:x1 + :x2 + :x3 + :x4))
5×5 DataFrame
 Row │ x1 x2 x3 x4 total_sum
     │ Float64 Float64 Float64 Float64 Float64
─────┼────────────────────────────────────────────────────
   1 │ 0.428323 0.757593 0.31246 0.640604 10.515
   2 │ 0.633038 0.169417 0.528082 0.669834 10.515
   3 │ 0.0376092 0.786284 0.399867 0.720137 10.515
   4 │ 0.673165 0.66684 0.437688 0.35086 10.515
   5 │ 0.614091 0.682412 0.511448 0.495272 10.515

```

---

<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:** [March 14, 2022, 6:00pm UTC](https://discourse.julialang.org/t/help-in-sum-columns/77883/3 "2022-03-14T18:00:06Z")

</div>

> [@folleyz](#):
>
> `colunasSum .=> sum => :Valor_desconto`

It seems to me that your problem is that you are broadcasting the first `=>` (i.e., you put a dot before it). Try @bkmins’s answers while taking care to not do it again.

---

<div class="post-metadata">

**Author:** ![folleyz](https://avatars.discourse-cdn.com/v4/letter/f/977dab/32.png) [@folleyz](https://discourse.julialang.org/u/folleyz)\
**Post date:** [March 14, 2022, 6:08pm UTC](https://discourse.julialang.org/t/help-in-sum-columns/77883/4 "2022-03-14T18:08:42Z")

</div>

Nice!

Thx for the help and the DataFramesMeta.jl tip.

I have only one more question, what are these “v” and the “…” that you used here:

```julia
transform(df, [:x1, :x2, :x3, :x4] => ((v...) -> sum(+(v...))) => :total_sum)

```

For now, thx @Henrique_Becker and @bkamins

---

<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:** [March 14, 2022, 6:13pm UTC](https://discourse.julialang.org/t/help-in-sum-columns/77883/5 "2022-03-14T18:13:43Z")

</div>

Copyed from an old [answer of mine](https://discourse.julialang.org/t/how-to-pass-set-of-attributes-to-command/77161/6):

> I think the manual sections you want are:
> 
> 1. [https://docs.julialang.org/en/v1/manual/faq/#The-two-uses-of-the-…-operator:-slurping-and-splatting](https://docs.julialang.org/en/v1/manual/faq/#The-two-uses-of-the-...-operator:-slurping-and-splatting) – FAQ section that confirms many beginners find `...` confusing.
> 2. [Keyword arguments](https://docs.julialang.org/en/v1/manual/functions/#Keyword-Arguments) – The manual section on keyword arguments.

---

<div class="post-metadata">

**Author:** ![folleyz](https://avatars.discourse-cdn.com/v4/letter/f/977dab/32.png) [@folleyz](https://discourse.julialang.org/u/folleyz)\
**Post date:** [March 14, 2022, 6:13pm UTC](https://discourse.julialang.org/t/help-in-sum-columns/77883/6 "2022-03-14T18:13:45Z")

</div>

I tried without the broadcasting and the error changed to:

```julia
colunasSum = [:CancIncorreto,:DifColetado,:FaltaCancelado,:FaltaPersonalizado,:QuebraCaixa] 
transform(df_pronto, colunasSum => sum => :Valor_desconto2)

MethodError: no method matching sum(::Vector{Float64}, ::Vector{Float64}, ::Vector{Float64}, ::Vector{Float64}, ::Vector{Float64})
Closest candidates are:
  sum(::Any, ::AbstractArray; dims, kw...) at C:\Users\Pedro Henrique\AppData\Local\Programs\Julia-1.7.2\share\julia\base\reducedim.jl:890
  sum(::Any, ::Any; kw...) at C:\Users\Pedro Henrique\AppData\Local\Programs\Julia-1.7.2\share\julia\base\reduce.jl:503
  sum(::AbstractArray; dims, kw...) at C:\Users\Pedro Henrique\AppData\Local\Programs\Julia-1.7.2\share\julia\base\reducedim.jl:889

```

i’m still learning where and how to use the broadcasting.

---

<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:** [March 14, 2022, 6:16pm UTC](https://discourse.julialang.org/t/help-in-sum-columns/77883/7 "2022-03-14T18:16:55Z")

</div>

Yes, the problem here is that you do not want `sum`, you want `+`.

What you are doing is equivalent to:

```julia
julia> sum([1, 2], [3, 4], [5, 6])
ERROR: MethodError: no method matching sum(::Array{Int64,1}, ::Array{Int64,1}, ::Array{Int64,1})
Closest candidates are:
  sum(::Any, ::AbstractArray; dims) at reducedim.jl:723
  sum(::Any, ::Any) at reduce.jl:494
  sum(::AbstractArray; dims) at reducedim.jl:722
  ...
Stacktrace:
 [1] top-level scope at REPL[1]:1

```

But what you want is:

```julia
julia> +([1, 2], [3, 4], [5, 6])
2-element Array{Int64,1}:
  9
 12

```

---

<div class="post-metadata">

**Author:** ![folleyz](https://avatars.discourse-cdn.com/v4/letter/f/977dab/32.png) [@folleyz](https://discourse.julialang.org/u/folleyz)\
**Post date:** [March 14, 2022, 6:19pm UTC](https://discourse.julialang.org/t/help-in-sum-columns/77883/8 "2022-03-14T18:19:43Z")

</div>

Wow! Nice!

Now i understand the difference!

Thx for that explanation and the manuals, i will read them.

---

<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:** [March 14, 2022, 6:30pm UTC](https://discourse.julialang.org/t/help-in-sum-columns/77883/9 "2022-03-14T18:30:45Z")

</div>

If you want you can use `sum` but then you need to pass one argument to sum not multiple arguments, just like @Henrique_Becker explained, so the codes would be:

```julia
transform(df, AsTable([:x1, :x2, :x3, :x4]) => sum => :sum_of_rows)

```

and

```julia
transform(df, AsTable([:x1, :x2, :x3, :x4]) => sum∘sum => :total_sum)

```

respectively.

But initially I did not want to introduce another level of complexity to our discussion.

---

<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:** [March 14, 2022, 6:35pm UTC](https://discourse.julialang.org/t/help-in-sum-columns/77883/10 "2022-03-14T18:35:18Z")

</div>

And now I see that I could avoid splatting and slurping earlier 😄 :

```julia
transform(df, [:x1, :x2, :x3, :x4] => sum∘(+) => :total_sum)

```

---

<div class="post-metadata">

**Author:** ![lrnv](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lrnv/32/19373_2.png) [@lrnv](https://discourse.julialang.org/u/lrnv)\
**Post date:** [March 14, 2022, 6:58pm UTC](https://discourse.julialang.org/t/help-in-sum-columns/77883/11 "2022-03-14T18:58:06Z")

</div>

> [@bkamins](#):
>
> And now I see that I could avoid splatting and slurping earlier 😄 :
> 
> ```julia
> transform(df, [:x1, :x2, :x3, :x4] => sum∘(+) => :total_sum)
> 
> ```

I am not a user of dataframes, but reading you i was wandering about allocations. Does this allocate a lot or does the `transform` function do some clever tricks ?

---

<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:** [March 14, 2022, 7:16pm UTC](https://discourse.julialang.org/t/help-in-sum-columns/77883/12 "2022-03-14T19:16:13Z")

</div>

This allocates just as much as `sum(x1 + x2 + x3 + x4)` would.  
This cannot be further optimized because `+` is not the same as `sum` (which uses `add_sum`).

However some transformations are optimized, especially for very wide tables. You can find their list [here](https://github.com/JuliaData/DataFrames.jl/blob/953401a1e05bb9d2d2019af46aa56b87daae380b/src/abstractdataframe/selectionfast.jl#L23).
