如何将值更改为丢失

时间:2018-10-04 02:24:38

标签: 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 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

在这种设置下,我试图将某些索引编码为分析的缺失值。有一个简单的解决方法吗?

1 个答案:

答案 0 :(得分:5)

朱莉娅(Julia)中的

missing是自己的类型:

julia> typeof(missing)
Missings.Missing

对于您而言,特别要注意的是:

julia> Missing <: Float64
false

也就是说,Missing不是Float64的子类型。现在,请注意:

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中,与missing相关的核心功能已移至Base中,因此您需要:

julia> Array{Union{Float64,Missing}}(missing, 2)
2-element Array{Union{Missing, Float64},1}:
 missing
 missing

这确实有点麻烦。但是,v0.6中的missings语法在Missings.jl中仍可用于v1.0。只是由于类型Missing本身已移至Base,所以很多人可能选择不理会它,因此与v0不同,您不需要 Missings.jl。 6。

如果您已经有一个Array{Float64},并且想将某些元素标记为missing,那么(据我所知)您将需要重新构造该数组。例如,在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个。这可能就是为什么像您一样使用常规数组时语法有点冗长的原因之一。

最后一点:您当然可以显式构造数组以接受任何类型,例如x = Any[1.0, 2.0] ; x[1] = missing。不利之处在于,现在编译器无法为使用x生成类型有效的代码,因此您将失去使用Julia的速度优势。