Sorting 定义自定义sortperm函数
在Julia中,假设我有以下矩阵:Sorting 定义自定义sortperm函数,sorting,matrix,mapping,julia,Sorting,Matrix,Mapping,Julia,在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 使用mapsicles和sortperm获得每列的排名,可以得到: r = mapslices(sortperm, rank; dims=1) 3×2 Array{Int64,2}: 1 3 2 2 3 1 问题在于NaN被视为“最差”
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
使用mapsicles
和sortperm
获得每列的排名,可以得到:
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
的元素进行比较。但我很肯定朱莉娅有一种更经典的方法: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]
NaN
在朱莉娅身上并不“特别”。它只是一个浮点值。如果要将NaN
视为缺失值,应首先将其转换为missing
,然后使用StatsBase.jl中的ordinalrank
函数:
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