Юлия: Поиск значений больше 0 в векторе с отсутствующим - PullRequest
1 голос
/ 12 апреля 2019

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

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

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

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

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

a(a<0)

, что дает мне

-1 -12

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

a[a.<0]

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

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

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

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

, которое дает мне

missing
3

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

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

ЛучшийРичард

1 Ответ

6 голосов
/ 12 апреля 2019

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

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 считается больше любого числа на 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) && x < 0, a)
2-element Array{Union{Missing, Int64},1}:
  -1
 -12

или

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

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

...