Hi everyone,
I am trying to sort and sum data based off of the first column of ‘DNVGL_total’ into a new array. However, when trying to do this, I get the error ‘Reducing over an empty collection is not allowed’
I am new and any help would be appreciated
It’s significantly easier to help if you post code as text instead of screenshots. You can pass the init=0 keyword to the sum function to provide it with a default value in the empty case:
sum(blah blah; init=0)
Note that the semicolon is necessary when the argument is a generator expression to help the parser know that you’re passing a keyword argument, not iterating over something new.
DNVGL_total =
[
2 1568 19 6 42 0 0 0
4 938 47 2 45 0 0 0
1 621 55 6 8 0 0 0
5 571 49 5 29 21 0 0
5 220 32 18 0 0 0 0
3 195 13 16 8 0 0 0
1 115 7 0 0 2 34 0
3 103 15 3 0 0 0 0
3 93 22 3 12 1 0 0
3 60 10 0 0 0 0 0
5 12 53 194 4 0 0 2
5 6 20 89 1 0 0 0
5 1 3 18 0 0 0 0
5 1 0 13 0 0 0 0
5 0 37 59 0 0 0 0
5 0 18 16 0 0 0 1
]
(Y,Z) = size(DNVGL_total)
DNVGL_total_sort = zeros(5,7)
for t=1:5
for a=1:7
DNVGL_total_sort[t,a] = sum(DNVGL_total[i,a+1] for i=1:Y if DNVGL_total[1:Y,1] == t)
end
end
#I want to create a new table that sums over the rows for each column, if the value in column 1 of DNVGL_total is equal to the row number of the new table
You can use triple backticks ``` to write code.
What about:
julia> [a == 1 ? t : sum(DNVGL_total[findall(DNVGL_total[:,1].==t),a]) for t in 1:5, a in 1:8]
5×8 Array{Int64,2}:
1 736 62 6 8 2 34 0
2 1568 19 6 42 0 0 0
3 451 60 22 20 1 0 0
4 938 47 2 45 0 0 0
5 811 212 412 34 21 0 3
(The first element of the row is unchanged.)
yes, thank you that is perfect!
I am using Julia 1.5.2 and this did not work: sum([];init=0) is giving me ERROR: MethodError: no method matching sum(::Array{Any,1}; init=0) but reduce(+, []; init=0) is working fine. Same thing with an iterator instead of an empty array.
The init keyword to sum was added in 1.6, which isn’t released yet.
Is there an alternative to “init” before version 1.6?