Как создать вектор пропущенных значений определенной длины в julia?

#julia

#julia

Вопрос:

В R я могу создать вектор длиной 5 со всеми NA_real_ значениями:

 x <- 1:5
length(x)
## [1] 5
rep(NA_real_, times = length(x))
## [1] NA NA NA NA NA  
 

Как я могу сделать то же самое в julia ? Я могу создать вектор, содержащий нули, но я не знаю, как поместить туда пропущенные значения:

 v = Vector{Float64}(undef, 5)
## 5-element Array{Float64,1}:
 0.0
 0.0
 0.0
 0.0
 0.0
 

Ответ №1:

Вызывается пропущенное значение в Julia missing . Это одноэлементный тип Missing . Вы можете создать вектор пропущенных значений следующим образом:

 v = Vector{Missing}(undef, 5)
# 5-element Array{Missing,1}:
#  missing
#  missing
#  missing
#  missing
#  missing
 

Или, что более удобно, используя fill :

 v = fill(missing, 5)
 

Имейте в виду, однако, что, в отличие от R, Missing не разделяет тип с другими числовыми типами: это его собственный тип. Обратите внимание, что происходит, когда вы пытаетесь поместить a Float64 в вектор Missing s:

 v = fill(missing, 5)
# 5-element Array{Missing,1}:
#  missing
#  missing
#  missing
#  missing
#  missing

v[1] = 3.14
# ERROR: MethodError: convert(::Type{Union{}}, ::Float64) is ambiguous.
 

Это означает, что если вы хотите создать вектор, содержащий только пропущенные значения, но вы хотите, чтобы он также мог содержать числовое значение, например a Float64 , вы должны быть явными:

 v = convert(Array{Union{Float64,Missing}}, v)
# 5-element Array{Union{Missing, Float64},1}:
#  missing
#  missing
#  missing
#  missing
#  missing

v[1] = 3.14;
v
# 5-element Array{Union{Missing, Float64},1}:
#  3.14
#   missing
#   missing
#   missing
#   missing
 

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

1. Спасибо. Я пытаюсь научить julia ускорять цикл for, который выполняется медленно в R (у меня нет другого варианта делать то, что я хочу делать без цикла). Но я думаю, что обучение может занять больше времени, чем цикл в R.

2. Да, но «обучение» похоже на компиляцию, это занимает время только один раз.

Ответ №2:

Vector{Union{Float64,Missing}}(missing, 5) должен делать то, что вы хотите.

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

1. Спасибо за вашу помощь.

2. Пакет Missings.jl также предоставляет missings(Float64, 5) в качестве сокращения.