Julia 如何将值更改为“缺少”
我似乎无法将Julia版本0.6.4中的值更改为missing(我相信在0.6之前是允许的) 示例代码: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
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]=缺少,则将返回相同的转换错误。