使用ShiftedArrays包lag()函数时,如何将布尔比较结果的missing转为NaN?
如何将ShiftedArrays滞后比较结果中的missing替换为NaN?
先来看你的示例场景:你用ShiftedArrays的lag()函数做数组滞后比较,得到的结果里包含missing值,希望把这些missing替换成NaN输出。
你的测试代码和当前输出:
using ShiftedArrays # 测试数据 o = collect(5.0:1.0:14) c = collect(1.0:1.0:10) # 使用ShiftedArrays进行滞后处理 o_c_lag1 = o .< lag(c,1) print(o_c_lag1) # 输出:Any[missing, false, false, false, false, false, false, false, false, false]
这是个很常见的需求,Julia里有几个非常简洁的方法可以实现:
方法1:用coalesce函数(推荐)
coalesce函数的作用就是将missing值替换为指定的默认值,直接用广播的方式就能批量处理整个数组:
o_c_lag1 = coalesce.(o .< lag(c,1), NaN) print(o_c_lag1) # 输出:[NaN, false, false, false, false, false, false, false, false, false]
这个方法最直接,而且效率很高,因为coalesce是专门针对missing值优化的函数。
方法2:用replace函数
如果你想在已有结果数组的基础上修改,或者喜欢链式写法,可以用replace:
# 方式一:直接替换 o_c_lag1 = o .< lag(c,1) o_c_lag1 = replace(o_c_lag1, missing => NaN) # 方式二:链式操作更简洁 o_c_lag1 = o .< lag(c,1) |> x -> replace(x, missing => NaN)
两种方式都能得到同样的结果,链式写法看起来更紧凑。
方法3:提前指定数组类型(可选)
如果你想避免生成Any类型的数组,可以先明确结果类型,再替换:
# 先得到Union{Bool, Missing}类型的数组 temp = o .< lag(c,1) # 转换为Union{Float64, Missing},再替换missing为NaN o_c_lag1 = replace(convert(Vector{Union{Float64, Missing}}, temp), missing => NaN)
不过这种方法比前两种繁琐一些,除非你对数组类型有严格要求,否则前两种方法足够用。
内容的提问来源于stack exchange,提问作者Andrew Bannerman
相关产品推荐
相关产品推荐

