Какой эффективный способ заполнить пропущенные значения предыдущим непропущенным значением? - PullRequest
1 голос
/ 06 ноября 2019

У меня есть вектор

using Missings
v = allowmissing(rand(100))
v[rand(100) .< 0.1] .= missing

как лучше всего заполнить v последним не пропущенным значением?

В настоящее время

for (i, val) in enumerate(v)
  ismissing(val) && (i >=2) && (v[i]=v[i-1])
end
first_non_missing = findfirst(x->!ismissing(x), v)
if first_non_missing >= 2
  v[1:first_non_missing -1] .= v[first_non_missing]
end
v = disallowmissing(v)

НоЯ нашел это медленно для больших векторов. Какой элегантный и эффективный способ заполнить пропущенные значения предыдущими не пропущенными значениями?

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Простое и быстрое решение:

replace_missing!(v) = accumulate!((n0,n1) -> ismissing(n1) ? n0 : n1, v, v, init=zero(eltype(v)))
1 голос
/ 06 ноября 2019

вам нужно значение инициализации в случае, если значение fist отсутствует, и я не могу выполнить ваш код. но с учетом сказанного, вот моя попытка:

function replace_missing!(v,init=zero(eltype(v)))
    function reduce_missing(n0,n1)
        if ismissing(n1)
            return n0
        else
            return n1
        end
    end
    v[1] = reduce_missing(init,v[1])
    for i = 2:length(v)
        v[i] = reduce_missing(v[i-1],v[i])
    end
return v
end
using Missings
v = allowmissing(rand(100))
v[rand(100) .< 0.1] .= missing
v = replace_missing!(v)
v = disallowmissing(v)
...