arrays - 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)
看起来这里需要一些其他方法,但我想不出一个方向
解决方案
你有两个自然的选择:
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
的“分类”概念CategoricalValue
Dict
unwrap
另请注意,如果您只想获取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
推荐阅读
- flutter - 在列表颤动中保存两个日期之间的差异
- r - 循环替换R中某些变量中的所有非空白值
- mysql - 快速选择具有 Where 条件的随机行
- c++ - 具有两个接口的多重继承,一个从第一个接口派生,一个派生类实现第一个接口
- wpf - 如何使用带有 IF 语句的单选按钮?
- c# - Unity 运行时曲面捕捉(如编辑器中的 Shift+Cntrl)
- react-testing-library - 使用 react/testing-library 对自定义重定向进行单元测试
- laravel - Laravel Octane 缓存驱动问题
- javascript - 如何从对象数组中获取键值对并从该键值对创建新对象
- c++ - 使用for循环创建对象数组时如何将参数传递给构造函数