# Sort elements by frequency in julia

**URL:** <https://discourse.julialang.org/t/sort-elements-by-frequency-in-julia/103433>\
**Category:** Data\
**Tags:** sort, sorting\
**Created:** [September 1, 2023, 5:19am UTC](https://discourse.julialang.org/t/sort-elements-by-frequency-in-julia/103433 "2023-09-01T05:19:08Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![raman\_kumar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raman_kumar/32/26782_2.png) [@raman\_kumar](https://discourse.julialang.org/u/raman_kumar)\
**Post date:** [September 1, 2023, 5:19am UTC](https://discourse.julialang.org/t/sort-elements-by-frequency-in-julia/103433/1 "2023-09-01T05:19:08Z")

</div>

I want to sort elements by frequency . For example let

```julia
x = ["a", "d", "d", "c", "c", "c", "f", "b", "b" ,"b", "b"]

```

I want to have output sorted as

```julia
x = ["b", "b" ,"b", "b","c", "c", "c, "d", "d", "a", "f"]

```

where we have 4 `b` , 3 `c` , 2`d` , 1`a` and 1`f`.

---

<div class="post-metadata">

**Author:** ![alfaromartino](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/alfaromartino/32/52986_2.png) [@alfaromartino](https://discourse.julialang.org/u/alfaromartino)\
**Post date:** [September 1, 2023, 5:54am UTC](https://discourse.julialang.org/t/sort-elements-by-frequency-in-julia/103433/2 "2023-09-01T05:54:50Z")

</div>

You can use `StatsBase`:

```julia
using StatsBase

function to_sort_x(x)
    counts = countmap(x)
    sorted_x = sort(x, by=x -> counts[x], rev=true)
    return sorted_x
end

sorted_x = to_sort_x(x)

```

If you’re using `DataFrames`, you can also do this

```julia
using DataFrames

x = ["a", "d", "d", "c", "c", "c", "f", "b", "b" ,"b", "b"]

df = DataFrame(x = x)

gdf = groupby(df, :x)
transform!(gdf, nrow => :count)
sort!(df, :count, rev=true)

sorted_x = copy(df.x)

```

---

<div class="post-metadata">

**Author:** ![digital\_carver](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/digital_carver/32/33818_2.png) [@digital\_carver](https://discourse.julialang.org/u/digital_carver)\
**Post date:** [September 1, 2023, 6:00am UTC](https://discourse.julialang.org/t/sort-elements-by-frequency-in-julia/103433/3 "2023-09-01T06:00:30Z")

</div>

Also using StatsBase, but with `rle` and its inverse instead of `countmap`:

```julia
function sort_by_count(x)
    v, l = rle(x)
    idxs = sortperm(l; rev=true)
    return @views inverse_rle(v[idxs], l[idxs])
end

```

Some minimal benchmarking suggests that this performs a few times faster than the `countmap` based method.

---

<div class="post-metadata">

**Author:** ![devel-chm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/devel-chm/32/3572_2.png) [@devel-chm](https://discourse.julialang.org/u/devel-chm)\
**Post date:** [September 1, 2023, 1:37pm UTC](https://discourse.julialang.org/t/sort-elements-by-frequency-in-julia/103433/4 "2023-09-01T13:37:25Z")

</div>

@digital_carver

Nice! I think you need to sort the incoming `x` otherwise  
the run length encoding won’t aggregate non-adjacent values.

---

<div class="post-metadata">

**Author:** ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)\
**Post date:** [September 5, 2023, 9:21pm UTC](https://discourse.julialang.org/t/sort-elements-by-frequency-in-julia/103433/5 "2023-09-05T21:21:20Z")

</div>

[Linking related thread,](https://discourse.julialang.org/t/sort-vector-by-frequency/14946)
