logo

ジュリアのカテゴリカル配列 📂ジュリア

ジュリアのカテゴリカル配列

概要

JuliaCategoricalArrays.jlパッケージは、Rfactorと似た機能を果たす。

コード

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