Вы хотите sortslices
, а не sort
- последний просто сортирует все столбцы независимо, тогда как первый переставляет целые фрагменты. Во-вторых, функция by
не принимает index , она принимает значение , которое собирается сравнивать (и позволяет каким-то образом преобразовать его). Таким образом:
julia> using Random
data = Union{Float64, String}[randn(100) [randstring(10) for _ in 1:100]]
100×2 Array{Union{Float64, String},2}:
0.211015 "6VPQbWU5f9"
-0.292298 "HgvHLkufqI"
1.74231 "zTCu1U5Vdl"
0.195822 "O3j43sbhKV"
⋮
-0.369007 "VzFH2OpWfU"
-1.30459 "6C68G64AWg"
-1.02434 "rldaQ3e0GE"
1.61653 "vjvn1SX3FW"
julia> sortslices(data, by=x->x[2], dims=1)
100×2 Array{Union{Float64, String},2}:
0.229143 "0syMQ7AFgQ"
-0.642065 "0wUew61bI5"
1.16888 "12PUn4V4gL"
-0.266574 "1Z2ONSBP04"
⋮
1.85761 "y2DDANcFCe"
1.53337 "yZju1uQqMM"
1.74231 "zTCu1U5Vdl"
0.974607 "zdiU0sVOZt"
К сожалению, у нас пока нет sortslices!
, но вы можете легко создать отсортированный вид с помощью sortperm
. Вероятно, это будет не так быстро использовать, но если вам нужна локальность по семантическим причинам, это подойдет.
julia> p = sortperm(data[:,2]);
julia> @view data[p, :]
100×2 view(::Array{Union{Float64, String},2}, [26, 45, 90, 87, 6, 96, 82, 75, 12, 27 … 53, 69, 100, 93, 36, 37, 39, 8, 3, 61], :) with eltype Union{Float64, String}:
0.229143 "0syMQ7AFgQ"
-0.642065 "0wUew61bI5"
1.16888 "12PUn4V4gL"
-0.266574 "1Z2ONSBP04"
⋮
1.85761 "y2DDANcFCe"
1.53337 "yZju1uQqMM"
1.74231 "zTCu1U5Vdl"
0.974607 "zdiU0sVOZt"
(Если вы хотите на месте по соображениям производительности, я бы порекомендовал использовать DataFrame или аналогичную структуру, которая содержит свои столбцы в качестве независимых однородных векторов - Union{Float64, String}
будет медленнее, чем два отдельных вектора с хорошо типизированными данными и sort!
использование DataFrame работает с целыми строками так, как вы хотите.)