Julia 如何将值更改为“缺少”

Julia 如何将值更改为“缺少”,julia,missing-data,Julia,Missing Data,我似乎无法将Julia版本0.6.4中的值更改为missing(我相信在0.6之前是允许的) 示例代码: using Dataframes x = zeros(5) 5-element Array{Float64,1}: 0.0 0.0 0.0 0.0 0.0 x[3] = missing ERROR: MethodError: Cannot `convert` an object of type Missings.Missing to an object of type F

我似乎无法将Julia版本0.6.4中的值更改为missing(我相信在0.6之前是允许的)

示例代码:

using Dataframes
x = zeros(5)
5-element Array{Float64,1}:
 0.0
 0.0
 0.0
 0.0
 0.0
x[3] = missing
ERROR: MethodError: Cannot `convert` an object of type Missings.Missing to an     
object of type Float64
This may have arisen from a call to the constructor Float64(...),
since type constructors fall back to convert methods.
Stacktrace:
[1] setindex!(::Array{Float64,1}, ::Missings.Missing, ::Int64) at ./array.jl:583

在此设置中,我尝试将某些标记编码为缺失值,以便进行分析。有简单的解决方法吗?

Julia中缺少的
属于自己的类型:

julia> typeof(missing)
Missings.Missing
在您的情况下,特别重要的是要注意:

julia> Missing <: Float64
false
julia> typeof(zeros(5))
Array{Float64,1}
因此,您构建了
x
,一个只应包含
Float64
的数组。由于
missing
不是
Float64
的子类型,因此当您尝试将
x
的一个元素更改为
missing
时,会出现错误,与尝试
x[3]=“a string”
时一样

如果希望数组同时包含类型
Missing
和类型
Float64
,则需要预先指定数组的元素可以是类型
Missing
或类型
Float64
。在Julia v0.6(您在问题中指定)中,您可以通过missings.jl包中的
missings
执行此操作,例如:

julia> x = missings(Float64, 2)
2-element Array{Union{Float64, Missings.Missing},1}:
 missing
 missing

julia> x[1] = 0.0
0.0

julia> x
2-element Array{Union{Float64, Missings.Missing},1}:
 0.0     
  missing
在v1.0中,与
缺失
相关的核心功能被移动到
基础
,因此您需要:

julia> Array{Union{Float64,Missing}}(missing, 2)
2-element Array{Union{Missing, Float64},1}:
 missing
 missing
这当然有点麻烦。但是,missings.jl中v0.6中的
missings
语法仍然适用于v1.0。只是许多人可能会选择不去理会这个问题,因为类型
Missing
本身已经移动到
Base
,所以与v0.6不同,您不需要Missings.jl

如果您已经有一个预先存在的
数组{Float64}
,并且希望将某些元素标记为
缺少
,那么(据我所知),您将需要重新构造该数组。例如,在v0.6和v1.0中,您可以使用:

julia> x = randn(2)
2-element Array{Float64,1}:
 -0.642867
 -1.17995 

julia> y = convert(Vector{Union{Missing,Float64}}, x)
2-element Array{Union{Float64, Missings.Missing},1}:
 -0.642867
 -1.17995 

julia> y[2] = missing
missing
请注意,
missing
通常被设想用于像
DataFrames
这样的数据类型中,在这种情况下,很多这类事情都会自动发生,因此您不必浪费时间键入太多的
Union
s。这可能是在处理像您这样的常规数组时语法有点冗长的原因之一


最后一点:您当然可以显式构造数组以接受任何类型,例如
x=any[1.0,2.0];x[1]=缺少
。缺点是,现在编译器无法生成使用
x
的高效类型代码,因此您将失去在Julia中工作的速度优势。

是否要使用
Dataframe
Dataframes
支持轻松的
缺失值。将数据添加到
数据框
后,只需分配
缺失的
值即可。如果您认为我已满意地回答了问题,则最好单击我的回答旁边的勾号来标记已回答。如果您觉得答案不令人满意,请留下评论,我会尽力改进。一种选择是
zero(Union{Float64,Missing},5)
,它仍然非常冗长。我想知道为什么删除了
缺失。如果将来,
联合体
可以使用更简单的语法,我们可能会看到类似于
零(Float64?,5)
@DNF同意这是一种很好的语法-我觉得我在某个地方看到过它的提议,可能是由你提出的:-)
缺失
没有被删除,它一直存在于Missings.jl包中。@MilanBouchet Valat啊,我没有意识到Missings.jl在跳转到v0.7后会继续被维护。我原以为所有的功能都迁移到了
Base
,但你是对的,他们在包中留下了一些功能。我将调整我的答案以反映这一点。非常感谢。@ColinTBowers谢谢,这很好地解决了主要问题。我特别是在数据帧的上下文中询问,但是我不确定是否充分考虑了缺少的方面。例如,运行x=0(5),y=0(5),df=DataFrame(y=y,x=x)。如果替换df[:x][2]=缺少,则将返回相同的转换错误。