如何将值更改为缺失值
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 中工作的速度优势。
我似乎无法在 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 中工作的速度优势。