按包含字符串的列之一对Julia 1.1矩阵进行排序

SeS*_*esa 5 arrays sorting string julia

如标题所示,我需要按某个矩阵的列之一对其进行排序,如果可能的话,最好将其排在适当的位置。所述列包含Strings(数组的类型为Array{Union{Float64,String}}),理想情况下,行应以字母顺序结束,由该列确定。线

sorted_rows = sort!(data, by = i -> data[i,2]),
Run Code Online (Sandbox Code Playgroud)

data我的矩阵在哪里,产生错误ERROR: LoadError: UndefKeywordError: keyword argument dims not assigned。指定我要排序的矩阵的哪一部分并添加参数dims=2(我假设这是我要排序的维度),即

sorted_rows = sort!(data[2:end-1,:], by = i -> data[i,2],dims=2)
Run Code Online (Sandbox Code Playgroud)

只需将错误消息更改为ERROR: LoadError: ArgumentError: invalid index: 01 Suurin yhteinen tekijä ja pienin yhteinen jaettava of type String。因此,编译器抱怨字符串是无效索引。

关于如何完成这种分类的任何想法?我应该说,在这种情况下,可以期望列中的字符串以数字开头,但是我不介意找到在一般情况下都可以使用的解决方案。

我正在使用Julia 1.1。

Mat*_* B. 7

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"
Run Code Online (Sandbox Code Playgroud)

不幸的是,我们还没有就地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"
Run Code Online (Sandbox Code Playgroud)

(如果出于性能原因需要就地放置,我建议您使用DataFrame或类似的结构将其列作为独立的同质向量保存- Union{Float64, String}比两个单独的类型良好的向量要慢,并且sort!将DataFrame设为有效在您想要的整行上。)