如何将值更改为缺失值

How to change a value to missing

我似乎无法在 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

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

missing 在 Julia 中是它自己的类型:

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,所以你不需要 Missings.jl, 不像 v0.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 中工作的速度优势。