#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
(вы также можете использовать синтаксис понимания в приведенных выше примерах)