Определить пользовательскую функцию sortperm - PullRequest
2 голосов
/ 27 июня 2019

Предположим, что у Джулии есть следующая матрица:

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. Но я совершенно уверен, что у Юлии классный способ сделать это: 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 Ответ

3 голосов
/ 27 июня 2019

NaN не является "особенным" в Юлии. Это просто значение с плавающей запятой. Если вы хотите, чтобы NaN обрабатывалось как пропущенное значение, вы должны сначала преобразовать его в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...