在 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
使用mapslices
和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
的每个元素进行比较。但我很确定 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]
最佳答案
NaN
在 Julia 中并不“特殊”。它只是一个浮点值。如果您希望将 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
关于sorting - 定义自定义 sortperm 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56791755/