# Creating data bins with numeric labels with cut()

**URL:** <https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281>\
**Category:** General Usage\
**Tags:** categoricalarrays\
**Created:** [May 18, 2022, 8:20pm UTC](https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281 "2022-05-18T20:20:35Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![DWSchulze](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dwschulze/32/35968_2.png) [@DWSchulze](https://discourse.julialang.org/u/DWSchulze)\
**Post date:** [May 18, 2022, 8:20pm UTC](https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281/1 "2022-05-18T20:20:35Z")

</div>

This is Python code to bin data into bins with a numerical label:

`pd.cut(housing["median_income"], bins=[0., 1.5, 3.0, 4.5, 6., np.inf], labels=[1, 2, 3, 4, 5])`

I want to do this in Julia, but it seems that Julia’s cut() function only allows for string labels:

```julia
cut(housingDF[:,:median_income], [0., 1.5, 3.0, 4.5, 6., 100.], labels=[1, 2, 3, 4, 5])
ERROR: TypeError: in keyword argument labels, expected Union{Function, AbstractVector{var"#s54"} where var"#s54"<:AbstractString}, got a value of type Vector{Int64}

```

It works with string labels though:

`cut(housingDF[:,:median_income], [0., 1.5, 3.0, 4.5, 6., 100.], labels=["1", "2", "3", "4", "5"])`

How can I get a numerical label for a data bin in Julia?

---

<div class="post-metadata">

**Author:** ![jd-foster](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jd-foster/32/35824_2.png) [@jd-foster](https://discourse.julialang.org/u/jd-foster)\
**Post date:** [May 19, 2022, 2:23am UTC](https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281/2 "2022-05-19T02:23:54Z")

</div>

A quick work-around is to convert to `String` values:  
`labels=string.([1, 2, 3, 4, 5]))`

---

<div class="post-metadata">

**Author:** ![DWSchulze](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dwschulze/32/35968_2.png) [@DWSchulze](https://discourse.julialang.org/u/DWSchulze)\
**Post date:** [May 19, 2022, 2:58am UTC](https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281/3 "2022-05-19T02:58:52Z")

</div>

I want numerical labels, not String labels.

---

<div class="post-metadata">

**Author:** ![Mason](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mason/32/2423_2.png) [@Mason](https://discourse.julialang.org/u/Mason)\
**Post date:** [May 19, 2022, 3:03am UTC](https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281/4 "2022-05-19T03:03:14Z")

</div>

> [@DWSchulze](#):
>
> I want to do this in Julia, but it seems that Julia’s cut() function only allows for string labels:

It’d help if you said where you got this `cut` function from. Julia itself does not provide a function called `cut` so I’m guessing this came from a package?

---

<div class="post-metadata">

**Author:** ![jd-foster](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jd-foster/32/35824_2.png) [@jd-foster](https://discourse.julialang.org/u/jd-foster)\
**Post date:** [May 19, 2022, 3:04am UTC](https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281/5 "2022-05-19T03:04:08Z")

</div>

[CategoricalArrays](https://github.com/JuliaData/CategoricalArrays.jl) ?

---

<div class="post-metadata">

**Author:** ![DWSchulze](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dwschulze/32/35968_2.png) [@DWSchulze](https://discourse.julialang.org/u/DWSchulze)\
**Post date:** [May 19, 2022, 3:37am UTC](https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281/6 "2022-05-19T03:37:06Z")

</div>

It’s from CategoricalArrays package. (The first one is from Python Pandas).

---

<div class="post-metadata">

**Author:** ![skleinbo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/skleinbo/32/36080_2.png) [@skleinbo](https://discourse.julialang.org/u/skleinbo)\
**Post date:** [May 19, 2022, 8:46am UTC](https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281/7 "2022-05-19T08:46:26Z")

</div>

Seems not possible at the moment.

> <https://github.com/JuliaData/CategoricalArrays.jl/blob/7c686fb10ef3be2e0064c738c40fa28725c13ed0/src/extras.jl#L194>

@nalimilan

---

<div class="post-metadata">

**Author:** ![nalimilan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nalimilan/32/147_2.png) [@nalimilan](https://discourse.julialang.org/u/nalimilan)\
**Post date:** [May 19, 2022, 9:18pm UTC](https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281/10 "2022-05-19T21:18:59Z")

</div>

IIRC I added that type assertion because inference failed without it. But maybe the compiler has improved since then and/or there are other solutions, like using `::Vector{eltype(labels)}`. Feel free to try that and make a PR if it works. You’ll also have to change `String` to `eltype(labels)` on line 207 too, and of course widen the type of `labels` in the method signature.

---

<div class="post-metadata">

**Author:** ![nalimilan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nalimilan/32/147_2.png) [@nalimilan](https://discourse.julialang.org/u/nalimilan)\
**Post date:** [May 19, 2022, 9:22pm UTC](https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281/11 "2022-05-19T21:22:41Z")

</div>

That said, you can easily get numeric values using `levelcode.(cut(housingDF.median_income, [0., 1.5, 3.0, 4.5, 6., 100.]))`. The difference is that you’ll get a plain `Vector{Int}` rather than a `CategoricalVector{Int}`, which may or may not be what you want.

(BTW, `housingDF[:,:median_income]` makes an unnecessary copy of the column, you can use `housingDF[!, :median_income]` or `housingDF.median_income` instead.)

---

<div class="post-metadata">

**Author:** ![skleinbo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/skleinbo/32/36080_2.png) [@skleinbo](https://discourse.julialang.org/u/skleinbo)\
**Post date:** [May 20, 2022, 2:19pm UTC](https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281/12 "2022-05-20T14:19:59Z")

</div>

It seems to be fine on 1.6 and 1.7 at least 🙂

[https://github.com/JuliaData/CategoricalArrays.jl/pull/393](https://github.com/JuliaData/CategoricalArrays.jl/pull/393)

---

<div class="post-metadata">

**Author:** ![DWSchulze](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dwschulze/32/35968_2.png) [@DWSchulze](https://discourse.julialang.org/u/DWSchulze)\
**Post date:** [May 20, 2022, 11:44pm UTC](https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281/13 "2022-05-20T23:44:42Z")

</div>

Definitely not in 1.6.6.

---

<div class="post-metadata">

**Author:** ![skleinbo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/skleinbo/32/36080_2.png) [@skleinbo](https://discourse.julialang.org/u/skleinbo)\
**Post date:** [May 24, 2022, 6:45am UTC](https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281/14 "2022-05-24T06:45:42Z")

</div>

Works now:

```julia
      Status `C:\Users\stephan\.julia\environments\v1.7\Project.toml`
  [324d7699] CategoricalArrays v0.10.6

julia> cut(0:10, 0:5:15, labels=[2.5, 7.5, 12.5])
11-element CategoricalArray{Float64,1,UInt32}:
 2.5
 2.5
 2.5
 2.5
 2.5
 7.5
 7.5
 7.5
 7.5
 7.5
 12.5

```

---

<div class="post-metadata">

**Author:** ![Juan\_Manuel\_Solis](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/juan_manuel_solis/32/47823_2.png) [@Juan\_Manuel\_Solis](https://discourse.julialang.org/u/Juan_Manuel_Solis)\
**Post date:** [March 17, 2023, 3:05pm UTC](https://discourse.julialang.org/t/creating-data-bins-with-numeric-labels-with-cut/81281/15 "2023-03-17T15:05:18Z")

</div>

How do you create right-closed intervals?
