alvas
alvas

Reputation: 122142

How to combine countmap and proportionmap in Julia?

The countmap can collate the counts of items in a list:

import StatsBase: countmap, proportionmap, addcounts!
a = [1,2,3,4,1,2,2,3,1,2,5,7,4,8,4]
b = [1,2,5,3,1,6,1,6,1,2,6,2]
x, y = countmap(a), countmap(b)

[out]:

(Dict(7=>1,4=>3,2=>4,3=>2,5=>1,8=>1,1=>3),Dict(2=>3,3=>1,5=>1,6=>3,1=>4))

I could add the counts from the raw list into the countmap dictionary as such:

z = addcounts!(x, b)

[out]:

Dict{Int64,Int64} with 8 entries:
  7 => 1
  4 => 3
  2 => 7
  3 => 3
  5 => 2
  8 => 1
  6 => 3
  1 => 7

But if somehow I have already got a counted dictionary, I couldn't just add them:

addcounts!(x, y)

[error]:

MethodError: no method matching addcounts!(::Dict{Int64,Int64}, ::Dict{Int64,Int64})
Closest candidates are:
  addcounts!{T}(::Dict{T,V}, ::AbstractArray{T,N}) at /Users/liling.tan/.julia/v0.5/StatsBase/src/counts.jl:230
  addcounts!{T,W}(::Dict{T,V}, ::AbstractArray{T,N}, ::StatsBase.WeightVec{W,Vec<:AbstractArray{T<:Real,1}}) at /Users/liling.tan/.julia/v0.5/StatsBase/src/counts.jl:237

Neither did this work too:

x + y

[error]:

MethodError: no method matching +(::Dict{Int64,Int64}, ::Dict{Int64,Int64})
Closest candidates are:
  +(::Any, ::Any, ::Any, ::Any...) at operators.jl:138

Is there a way to combine multiple countmaps ?

E.g. in Python:

>>> from collections import Counter
>>> a = [1,2,3,4,1,2,2,3,1,2,5,7,4,8,4]
>>> b = [1,2,5,3,1,6,1,6,1,2,6,2]
>>> x, y = Counter(a), Counter(b)
>>> z = x + y
>>> z
Counter({1: 7, 2: 7, 3: 3, 4: 3, 6: 3, 5: 2, 7: 1, 8: 1})

Upvotes: 3

Views: 373

Answers (2)

Dan Getz
Dan Getz

Reputation: 18217

As Jun Zhang suggested DataStructures.jl provides Accumulator type (a.k.a counter). Specifically, to get the results in the question:

using DataStructures

x,y = counter(a),counter(b)

push!(x,y)          # push! replaces addcounts!

Now x containts the sum of x and y.

Upvotes: 1

Jun Zhang
Jun Zhang

Reputation: 308

Basically the problem is to sum two dictionaries. Julia standard library does provide such a functionality.

You could try DataStructures.jl. The merge() function is roughly equivalent to addition of Counters in Python. If you do not want a whole package for this, it should not be hard to do it by hand.

Upvotes: 1

Related Questions