定义自定义sortperm函数

时间:2019-06-27 13:08:25

标签: sorting matrix mapping julia

在朱莉娅中,我们假设我有以下矩阵:

julia> rank = [[1.0,2.0,NaN] [5.0,3.0,1.0]]
3×2 Array{Float64,2}:
   1.0  5.0
   2.0  3.0
 NaN    1.0

使用mapslicessortperm获得每一列的排名会得出:

 r = mapslices(sortperm, rank; dims=1)
3×2 Array{Int64,2}:
 1  3
 2  2
 3  1

问题在于NaN被视为“最差”元素,而不是被保留在最终矩阵中。我最后想要的是:

3×2 Array{Int64,2}:
 1  3
 2  2
 NaN  1

我目前的解决方法是将r的每个元素与rank的每个元素进行比较。但是我很确定朱莉娅(Julia)有一个更经典的方法:p。

当前解决方法:还不够,因为在mapslices之后需要额外的计算以及创建另一个数组new_r

nrow, ncol = size(r)
new_r = [Float64(ifelse(isnan(rank[i,j]), NaN, r[i,j])) for i in 1:nrow, j in 1:ncol]

1 个答案:

答案 0 :(得分:3)

NaN在Julia中不是“特殊”的。它只是一个浮点值。如果希望将missing视为缺失值,则应首先将其转换为ordinalrank,然后使用StatsBase.jl中的julia> rank = [[1.0,2.0,NaN] [5.0,3.0,1.0]] 3×2 Array{Float64,2}: 1.0 5.0 2.0 3.0 NaN 1.0 julia> using StatsBase julia> mapslices(rank; dims=1) do x ordinalrank(replace(x, NaN=>missing)) end 3×2 Array{Union{Missing, Int64},2}: 1 3 2 2 missing 1 函数:

{{1}}