Мне интересно, почему индексирование DataArrays Джулии с значениями NA невозможно. Excuting пропущено ниже приводит к ошибке (NAException («не может индексировать массив с DataArray, содержащими значения NA»)):Индексирование данных данных Julia с включенными значениями NA
dm = data([1 4 7; 2 5 8; 3 1 9])
dm[dm .== 5] = NA
dm[dm .< 3] = 1 #Error
dm[(!isna(dm)) & (dm .< 3)] = 1 #Working
Существует В решениях, чтобы игнорировать числовые апертуры в DataFrame с isna()
, как ответил here , На первый взгляд он работает так, как следует, и игнорирование NA в DataFrames - это тот же подход, что и для DataArrays, потому что каждый столбец DataFrame является DataArray, указанным here. Но, по-моему, игнорирование отсутствующих значений с !isna()
по каждому условию - не лучшее решение.
Для меня непонятно, почему модуль DataFrame генерирует ошибку, если NA включены. Если логический массив, необходимый для индексирования, имеет значения NA, эти значения должны преобразовываться в false
, как MATLAB® или Pythons Pandas. В DataArray модули исходного кода (как показано ниже) в indexing.jl, существует явная функция бросить NAException:
# Indexing with NA throws an error
function Base.to_index(A::DataArray)
any(A.na) && throw(NAException("cannot index an array with a DataArray containing NA values"))
Base.to_index(A.data)
end
Если изменить фрагмент кода, установив НС в ложь ...
# Indexing with NA throws an error
function Base.to_index(A::DataArray)
A[A.na] = false
any(A.na) && throw(NAException("cannot index an array with a DataArray containing NA values"))
Base.to_index(A.data)
end
... dm[dm .< 3] = 1
работает так, как должно (например, в MATLAB® или Pandas).
Для меня нет смысла автоматически бросать ошибку, если NA включены в индексирование. В этом случае должен быть параметр, создающий DataArray, чтобы пользователь мог выбрать, игнорируются ли NA. Есть две существенные причины: с одной стороны, это не очень приятно писать и читать код, когда у вас есть формулы с большим количеством индексирования и значениями NA (например, вычисление моделей метеорологической сетки), а с другой стороны, наблюдается заметная потеря производительность, что это timetest показывает:
@timeit dm[(!isna(dm)) & (dm .< 3)] = 1 #14.55 µs per loop
@timeit dm[dm .< 3] = 1 #754.79 ns per loop
что является причиной того, что разработчики делают использование этого исключения, и есть еще более простой подход, как !isna()
за игнорирование NA-й в DataArrays?