我似乎无法在 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
在此设置中,我尝试将某些索引编码为缺失值以进行分析。有没有简单的解决方法?
最佳答案
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
执行此操作,位于 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
在v1.0中,与missing
相关的核心功能搬入Base
,所以你需要:
julia> Array{Union{Float64,Missing}}(missing, 2)
2-element Array{Union{Missing, Float64},1}:
missing
missing
这确实有点麻烦。然而,missings
v0.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
请注意missing
通常设想用于像 DataFrames
这样的数据类型,其中很多事情会自动为您发生,因此您不必浪费时间输入这么多 Union
s。这可能是像您这样使用常规数组时语法有点冗长的原因之一。
最后一点:您当然可以显式构造数组以接受任何类型,例如x = Any[1.0, 2.0] ; x[1] = missing
。缺点是现在编译器无法生成类型高效的代码来处理 x
因此您将失去在 Julia 中工作的速度优势。
关于julia - 如何将值更改为缺失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52638102/