如何使用下一个有效观察来填充向量中的“缺失”

How to fill `missings` in a vector using next valid observation

有没有具体的函数可以在数组中填充missings? MWE:

x = [missing,missing,2,3,missing,4]
desired = [2,2,2,3,4,4]

我不知道一个,但你总是可以创建一个:

for i in 1:length(array)
    if array[i] === missing
        array[i] = 1 # whatever you choose
    end 
end

注意:当你打印出新数组的类型时,你会看到 Vector{Union{Missing, Int64}}

该功能不在 Base 语言中,但在 Impute.jl 中。您正在寻找的是 Next Observation carried Backward Imputation (nocb)。你可以通过以下方式使用那个 julia 包来做到这一点:

using Impute (if you don't have the package in your enviroment, add it)
x = [missing,missing,2,3,missing,4]
y = copy(x)
Impute.nocb!(x) #implace, overwrites x
z = Impute.nocb(y) #creates a new vector 

它还有其他形式的数据插补,所以如果你要插补表格数据,那是最安全的方法。

您也可以实现自己的 nocb。这是 Impute.jl 使用的实现,有一些简化:

#implace version
function nocb!(data::AbstractVector{Union{T, Missing}}) where T
    @assert !all(ismissing, data)
    end_idx = findlast(!ismissing, data)
    count = 1
    for i in end_idx - 1:-1:firstindex(data)
        if ismissing(data[i])
            data[i] = data[i+1]
        else
            end_idx = i
            count = 1
        end
    end
    return data
end
#out of place version
nocb(x) = nocb!(copy(x))

我想出了这个解决方案,但是,我希望 accumulate! 有反向选项:

function bf!(x)
   init = x[end]
   @inbounds for i in reverse(eachindex(x))
       ismissing(x[i]) ? x[i] = init : init = x[i]
   end
   x
end