rafaqz / DimensionalData.jl

Named dimensions and indexing for julia arrays and other data
https://rafaqz.github.io/DimensionalData.jl/stable/
MIT License
262 stars 38 forks source link

Cannot get my own `Categorical` order to work #676

Open lehoff opened 3 months ago

lehoff commented 3 months ago

I have this array:

╭─────────────────────────╮
│ 4×4 DimArray{Float64,2} │
├─────────────────────────┴─────────────────────────────── dims ┐
  ↓ from Categorical{String} ["HTT", "H", "HT", "ε"] Unordered,
  → to   Categorical{String} ["HTT", "H", "HT", "ε"] Unordered
└───────────────────────────────────────────────────────────────┘
 ↓ →      "HTT"   "H"   "HT"   "ε"
  "HTT"  0.0     0.0   0.0    0.5
  "H"    0.0     0.0   0.5    0.5
  "HT"   0.5     0.0   0.0    0.0
  "ε"    0.0     0.5   0.0    0.5

and I want to reorder the colums like this:

new_order = Categorical(["ε", "H", "HT", "HTT"])
reorder(Q, :from => new_order)

(I need a differen order than new_order on the to axis later on, but that is not for now.)

However, I get this error:

MethodError: no method matching _reorder(::Type{AutoOrder}, ::DimMatrix{Float64, Tuple{Dim{:from, Categorical{String, Vector{String}, Unordered, NoMetadata}}, Dim{:to, Categorical{String, Vector{String}, Unordered, NoMetadata}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, NoMetadata}, ::Dim{:from, Categorical{String, Vector{String}, Unordered, NoMetadata}})

Closest candidates are:
  _reorder(::Type{Unordered}, ::Any, ::DimensionalData.Dimensions.Dimension)
   @ DimensionalData ~/.julia/packages/DimensionalData/UZlkh/src/utils.jl:62
  _reorder(::Type{O}, ::Any, ::DimensionalData.Dimensions.Dimension) where O<:Ordered
   @ DimensionalData ~/.julia/packages/DimensionalData/UZlkh/src/utils.jl:60
  _reorder(::Order, ::Any, ::DimensionalData.Dimensions.Dimension)
   @ DimensionalData ~/.julia/packages/DimensionalData/UZlkh/src/utils.jl:58
  ...

Stacktrace:
 [1] _reorder(neworder::AutoOrder, x::DimMatrix{Float64, Tuple{Dim{:from, Categorical{String, Vector{String}, Unordered, NoMetadata}}, Dim{:to, Categorical{String, Vector{String}, Unordered, NoMetadata}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, NoMetadata}, dim::Dim{:from, Categorical{String, Vector{String}, Unordered, NoMetadata}})
   @ DimensionalData ~/.julia/packages/DimensionalData/UZlkh/src/utils.jl:58
 [2] reorder(x::DimMatrix{Float64, Tuple{Dim{:from, Categorical{String, Vector{String}, Unordered, NoMetadata}}, Dim{:to, Categorical{String, Vector{String}, Unordered, NoMetadata}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, NoMetadata}, orderdim::Dim{:from, Categorical{String, Vector{String}, AutoOrder, NoMetadata}})
   @ DimensionalData ~/.julia/packages/DimensionalData/UZlkh/src/utils.jl:56
 [3] _reorder(x::DimMatrix{Float64, Tuple{Dim{:from, Categorical{String, Vector{String}, Unordered, NoMetadata}}, Dim{:to, Categorical{String, Vector{String}, Unordered, NoMetadata}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, NoMetadata}, orderdims::Tuple{Dim{:from, Categorical{String, Vector{String}, AutoOrder, NoMetadata}}})
   @ DimensionalData ~/.julia/packages/DimensionalData/UZlkh/src/utils.jl:51
 [4] reorder(x::DimMatrix{Float64, Tuple{Dim{:from, Categorical{String, Vector{String}, Unordered, NoMetadata}}, Dim{:to, Categorical{String, Vector{String}, Unordered, NoMetadata}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, NoMetadata}, dimwrappers::Tuple{Dim{:from, Categorical{String, Vector{String}, AutoOrder, NoMetadata}}})
   @ DimensionalData ~/.julia/packages/DimensionalData/UZlkh/src/utils.jl:41
 [5] reorder(x::DimMatrix{Float64, Tuple{Dim{:from, Categorical{String, Vector{String}, Unordered, NoMetadata}}, Dim{:to, Categorical{String, Vector{String}, Unordered, NoMetadata}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, NoMetadata}, ps::Tuple{Pair{Symbol, Categorical{String, Vector{String}, AutoOrder, NoMetadata}}})
   @ DimensionalData ~/.julia/packages/DimensionalData/UZlkh/src/utils.jl:39
 [6] reorder(::DimMatrix{Float64, Tuple{Dim{:from, Categorical{String, Vector{String}, Unordered, NoMetadata}}, Dim{:to, Categorical{String, Vector{String}, Unordered, NoMetadata}}}, Tuple{}, Matrix{Float64}, DimensionalData.NoName, NoMetadata}, ::Pair{Symbol, Categorical{String, Vector{String}, AutoOrder, NoMetadata}})
   @ DimensionalData ~/.julia/packages/DimensionalData/UZlkh/src/utils.jl:38
 [7] top-level scope
   @ In[272]:2

If I add in an order=... in the call to Categorical the error goes away, but I am not getting the order I want.

It seems somewhat related to #626, but I know too little about Julia to judge that.

rafaqz commented 3 months ago

reorder just doesn't do what you want unfortunately.

It just switches the current Ordered order, whatever it is, to one you want, like ForwardOrdered. Its like reverse but declaritive rather than imperitive.

But that is actually a cool idea... reorder could do a lot more than it does currently.

rafaqz commented 3 months ago

But actually, you can just do this with a vector in At!

Q[from=At(["ε", "H", "HT", "HTT"])]

Except it wont fix the order if you break it! Starting with Unordered that is of course not a problem.