Джулия: поиск значений больше 0 в векторе с отсутствующими

#julia #missing-data

#джулия #отсутствуют данные

Вопрос:

Я довольно новичок в Julia, и как пользователь Matlab / R я нахожу, что по большей части с ним действительно приятно работать.

Тем не менее, я немного смущен отсутствующими значениями и тем, как с ними работать.

Допустим, у меня есть вектор:

 a=[missing -1 2 3 -12] #Julia
a=[NaN -1 2 3 -12] #Matlab
  

В Matlab я бы просто сделал следующее, чтобы найти значения ниже 0

 a(a<0)
  

что дает мне

 -1 -12
  

То же самое, к сожалению, не работает в Julia и когда я пытаюсь

 a[a.<0]
  

в Julia я просто получаю следующую ошибку

 ERROR: ArgumentError: unable to check bounds for indices of type Missing
  

Я также попробовал следующее

 a[findall(skipmissing(a).<0)]
  

что дает мне

 missing
3
  

поскольку, конечно, я пропустил отсутствующее значение в функции findall. Я почти уверен, что есть простой и логичный способ сделать это, но, похоже, я не могу его найти.

Может кто-нибудь, пожалуйста, показать мне путь?

С наилучшими пожеланиями, Ричард

Комментарии:

1. Обратите внимание, что пример Matlab не эквивалентен примеру Julia. Если вы используете NaN вместо missing в Julia, то a[a.<0] работает точно так же, как в Matlab.

Ответ №1:

Вот самый простой способ сделать это:

 julia> a=[missing -1 2 3 -12]
1×5 Array{Union{Missing, Int64},2}:
 missing  -1  2  3  -12

julia> a[isless.(a, 0)]
2-element Array{Union{Missing, Int64},1}:
  -1
 -12
  

При этом используется тот факт, что missing считается больше любого числа by isless .

Другой способ записать это:

 julia> filter(x -> isless(x, 0), a)
2-element Array{Union{Missing, Int64},1}:
  -1
 -12
  

Теперь, чтобы избежать этого специального трюка, isless вы можете сделать следующее (использование coalesce — это общий подход, который можно использовать для безопасной обработки missing значений):

 julia> a[coalesce.(a .< 0, false)]
2-element Array{Union{Missing, Int64},1}:
  -1
 -12
  

или

 julia> filter(x -> coalesce(x < 0, false), a)
2-element Array{Union{Missing, Int64},1}:
  -1
 -12
  

наконец, вы можете быть более явными, например:

 julia> filter(x -> !ismissing(x) amp;amp; x < 0, a)
2-element Array{Union{Missing, Int64},1}:
  -1
 -12
  

или

 julia> [v for v in a if !ismissing(v) amp;amp; v < 0]
2-element Array{Int64,1}:
  -1
 -12
  

(вы также можете использовать синтаксис понимания в приведенных выше примерах)