首页 > 解决方案 > Julia:将分类数组转换为数值数组的完美方法是什么?

问题描述

将分类数组转换为简单数值数组的完美方法是什么?例如:

using CategoricalArrays
a = CategoricalArray(["X", "X", "Y", "Z", "Y", "Y", "Z"])
b = recode(a, "X"=>1, "Y"=>2, "Z"=>3)

作为转换的结果,我们仍然得到一个分类数组,即使我们明确指定了赋值的类型:

b = recode(a, "X"=>1::Int64, "Y"=>2::Int64, "Z"=>3::Int64)

看起来这里需要一些其他方法,但我想不出一个方向

标签: arraysjuliacategorical-data

解决方案


你有两个自然的选择:

julia> recode(unwrap.(a), "X"=>1, "Y"=>2, "Z"=>3)
7-element Vector{Int64}:
 1
 1
 2
 3
 2
 2
 3

或者

julia> mapping = Dict("X"=>1, "Y"=>2, "Z"=>3)
Dict{String, Int64} with 3 entries:
  "Y" => 2
  "Z" => 3
  "X" => 1

julia> [mapping[v] for v in a]
7-element Vector{Int64}:
 1
 1
 2
 3
 2
 2
 3

Dict方法较慢,但如果您要映射多个级别,它会更加灵活。

这里的关键功能是放弃(在样式中自动调用)unwrap的“分类”概念CategoricalValueDictunwrap

另请注意,如果您只想获取levelcode存储在 a 中的值的 s CategoricalArray(R 默认情况下执行的操作),那么您可以这样做:

julia> levelcode.(a)
7-element Vector{Int64}:
 1
 1
 2
 3
 2
 2
 3

另请注意, withlevelcode missing映射到missing

julia> x = CategoricalArray(["Y", "X", missing, "Z"])
4-element CategoricalArray{Union{Missing, String},1,UInt32}:
 "Y"
 "X"
 missing
 "Z"

julia> levelcode.(x)
4-element Vector{Union{Missing, Int64}}:
 2
 1
  missing
 3

推荐阅读