如何使用下一个有效观察来填充向量中的“缺失”
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
有没有具体的函数可以在数组中填充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