Nov*_*tat 4 missing-data julia
我似乎无法在Julia版本0.6.4中将值更改为缺失(我相信它在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
Run Code Online (Sandbox Code Playgroud)
在此设置中,我尝试将某些指标编码为分析的缺失值.有一个简单的解决方法吗?
missing 在朱莉娅是自己的类型:
julia> typeof(missing)
Missings.Missing
Run Code Online (Sandbox Code Playgroud)
在您的情况下,特别重要的是要注意:
julia> Missing <: Float64
false
Run Code Online (Sandbox Code Playgroud)
也就是说,Missing它不是一个子类型Float64.现在,请注意:
julia> typeof(zeros(5))
Array{Float64,1}
Run Code Online (Sandbox Code Playgroud)
所以你构造x一个只应该包含的数组Float64.由于missing不是一个亚型Float64,当你尝试改变的要素之一x来missing,你会得到一个错误,以同样的方式,如果你尝试,你会得到一个错误x[3] = "a string".
如果希望数组包含类型Missing和类型Float64,则需要预先指定数组的元素可以是类型Missing或类型Float64.在Julia v0.6(您在问题中指定)中,您可以通过missings位于Missings.jl包中执行此操作,例如:
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
Run Code Online (Sandbox Code Playgroud)
在v1.0中,与之相关的核心功能missing已移入Base,因此您需要:
julia> Array{Union{Float64,Missing}}(missing, 2)
2-element Array{Union{Missing, Float64},1}:
missing
missing
Run Code Online (Sandbox Code Playgroud)
这当然有点麻烦.但是,missingsvins.6中的语法仍可用于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
Run Code Online (Sandbox Code Playgroud)
请注意,missing通常设想在数据类型中使用,例如DataFrames,很多这样的东西会自动发生,因此您不必浪费时间输入这么多Unions.这可能是在处理常规数组时语法有点冗长的一个原因.
最后一点:您当然可以显式构造您的数组以接受任何类型,例如x = Any[1.0, 2.0] ; x[1] = missing.缺点是现在编译器无法生成类型高效的代码x,因此您将失去在Julia中工作的速度优势.