ジュリアのカテゴリカル配列
概要
JuliaのCategoricalArrays.jl
パッケージは、Rのfactor
と似た機能を果たす。
コード
julia> A = ["red", "blue", "red", "green"]
4-element Vector{String}:
"red"
"blue"
"red"
"green"
julia> B = categorical(A)
4-element CategoricalArray{String,1,UInt32}:
"red"
"blue"
"red"
"green"
julia> levels(B)
3-element Vector{String}:
"blue"
"green"
"red"
categorical()
categorical()
関数で通常の配列をカテゴリカル配列にキャストcastできる。
levels()
levels()
関数では、カテゴリーを確認できる。当然、カテゴリーに重複はなく、配列にそのカテゴリーに対応する要素がなくてもカテゴリー自体は維持される。
julia> B[2] = "red"; B
4-element CategoricalArray{String,1,UInt32}:
"red"
"red"
"red"
"green"
julia> levels(B)
3-element Vector{String}:
"blue"
"green"
"red"
このように配列の状態に関係なくカテゴリーが維持される特徴は、特定のコーディングで非常に便利な特性となる。特にデータ分析と関連した作業では、データセットのサブセットsubsetを多く扱うが、その時カテゴリカル配列を知っていれば大きな助けとなる。
最適化
わざわざlevels()
を使わなくても、ただの通常の配列でunique()
を使えば似たような実装はできる。
julia> @time for t in 1:10^6
unique(A)
end
0.543157 seconds (6.00 M allocations: 579.834 MiB, 17.33% gc time)
julia> @time for t in 1:10^6
levels(B)
end
0.013324 seconds
しかし、その速さは約40倍の差がある。元々配列が変化するたびにカテゴリーが更新されるため、別途計算する必要なく直接参照できる。
全コード
using CategoricalArrays
A = ["red", "blue", "red", "green"]
B = categorical(A)
levels(B)
B[2] = "red"; B
levels(B)
@time for t in 1:10^6
unique(A)
end
@time for t in 1:10^6
levels(B)
end
環境
- OS: Windows
- julia: v1.6.3
- CategoricalArrays v0.10.2