可以通过CategoricalArrays.jl package提供的cut method找到现成的解决方案,只要你对Strings的AbstractVector没问题:
using CategoricalArrays
x = rand(10);
cut(x, 4)
# 10-element CategoricalArray{String,1,UInt32}:
# "Q4: [0.565838, 0.85564]"
# "Q2: [0.333373, 0.393529)"
# "Q4: [0.565838, 0.85564]"
# "Q3: [0.393529, 0.565838)"
# "Q1: [0.0381196, 0.333373)"
# "Q3: [0.393529, 0.565838)"
# "Q4: [0.565838, 0.85564]"
# "Q1: [0.0381196, 0.333373)"
# "Q1: [0.0381196, 0.333373)"
# "Q2: [0.333373, 0.393529)"
如果你想要分位数为数字,你可以通过广播levelcode获取等级代码:
a = cut(x, 4);
levelcode.(a)
# 10-element Array{Int64,1}:
# 4
# 2
# 4
# 3
# 1
# 3
# 4
# 1
# 1
# 2
这可以很容易地转换为在管道中工作的函数:
xtile(x; n=4) = levelcode.(cut(x, n));
xtile(x)
# 10-element Array{Int64,1}:
# 4
# 2
# 4
# 3
# 1
# 3
# 4
# 1
# 1
# 2
xtile(x, n=5)
# 10-element Array{Int64,1}:
# 4
# 2
# 5
# 4
# 1
# 3
# 5
# 2
# 1
# 3