Языку Julia еще нужно сделать много вещей, чтобы получить долю в поле анализа данных, одна из которых — справиться с пропущенными значениями. При анализе данных очень часто в выборках наблюдений отсутствуют значения.Если инструменту анализа не хватает механизма преодоления, инструмент спотыкается.
Обработка пропущенных значений в языке R
Язык R появился в 1990-х годах и имеет долгую историю развития, поэтому механизм обработки пропущенных значений относительно завершен.
> a <- c(1,NA,2,3,NA)
> a
[1] 1 NA 2 3 NA
> a+1
[1] 2 NA 3 4 NA
> mean(a)
[1] NA
> mean(a,na.rm = T)
[1] 2
Распространенной структурой данных является dataframe, так как же быть с пропущенными значениями в этом типе данных?
Обработка R по-прежнему очень удобна, конкретный код выглядит следующим образом.
> df <- data.frame(a,b=LETTERS[1:5])
> df
a b
1 1 A
2 NA B
3 2 C
4 3 D
5 NA E
> mean(df[,"a"])
[1] NA
> mean(df[,"a"],na.rm = T)
[1] 2
родная Юлия
Родное представление Джулии и обработка пропущенных значений несовершенны. Конкретные примеры следующие.
julia> a=[1 Nullable() 2 3 Nullable()]
1×5 Array{Nullable{Int64},2}:
1 #NULL 2 3 #NULL
julia> a+1
WARNING: a::AbstractArray + b::Number is deprecated, use broadcast(+, a, b) instead.
julia> broadcast(+, a, 1)
ERROR: MethodError: no method matching +(::Nullable{Int64}, ::Int64)
Closest candidates are:
+(::Any, ::Any, ::Any, ::Any...) at operators.jl:468
+(::Complex{Bool}, ::Real) at complex.jl:275
+(::Char, ::Integer) at char.jl:40
...
Обработка пустых пакетов
Теперь сторонний пакетNulls.jlдля представления и обработки пропущенных значений.
julia> using Nulls
julia> a=[1 null 2 3 null]
1×5 Array{Union{Nulls.Null, Int64},2}:
1 null 2 3 null
julia> a+1
1×5 Array{Any,2}:
2 null 3 4 null
julia> mean(a)
null
Таким образом, Джулия делает большой шаг вперед в представлении и обработке пропущенных значений. Однако в языке R NULL означает пустое значение, а NA означает отсутствующее значение.
Приведенное выше усредняет вектор с пропущенными значениями, и результат пуст. В настоящее время функция среднего значения не работает с типом Null.
help?> mean
search: mean mean! median median! RemoteChannel SegmentationFault macroexpand @macroexpand @macroexpand1 module_parent
mean(f::Function, v)
Apply the function f to each element of v and take the mean.
julia> mean(√, [1, 2, 3])
1.3820881233139908
julia> mean([√1, √2, √3])
1.3820881233139908
mean(v[, region])
Compute the mean of whole array v, or optionally along the dimensions in region.
| Note
|
| Julia does not ignore NaN values in the computation. For applications requiring the handling of missing
| data, the DataArrays.jl package is recommended.
Так что просто сделайте следующее. Функция Nulls.skip предоставляется пакетом Nulls.
julia> mean(Nulls.skip(a))
2.0
последнее сейчасDataFramesТакже обратились к методам пакета Nulls для представления и обработки отсутствующих значений.
julia> using DataFrames
julia> df = DataFrame(A = [1, null, 2, 3, null], B = ["a", "b", "c", "d", "e"])
5×2 DataFrames.DataFrame
│ Row │ A │ B │
├─────┼──────┼───┤
│ 1 │ 1 │ a │
│ 2 │ null │ b │
│ 3 │ 2 │ c │
│ 4 │ 3 │ d │
│ 5 │ null │ e │
julia> df[:A]
5-element Array{Union{Nulls.Null, Int64},1}:
1
null
2
3
null
julia> mean(df[:A])
null
julia> mean(Nulls.skip(df[:A]))
2.0
Мое личное предположение заключается в том, что после того, как собственные или сторонние методы представления отсутствующих значений станут зрелыми и стабильными, некоторые функции, связанные с работой с объектами, которые могут иметь отсутствующие значения, должны добавить методы (см. главу «Методы» руководства Julia ), чтобы обрабатывать их более кратким образом. В настоящее время принятие метода Nulls.skip не должно быть долгосрочным решением.
дальнейшее чтение
Информация о версии
R version 3.4.2 (2017-09-28) -- "Short Summer"
Julia
Version 0.7.0-DEV.2098 (2017-10-10 11:37 UTC)
Commit 546a801260* (16 days old master)
- DataFrames 0.10.1+ master
- Nulls 0.1.2+ master
Среди них сторонний пакет Джулии, предназначенный для прямого клонирования последнего кода вручную.
=========
Пополнить:
Начиная с версии 0.7.0-DEV.3095 (19 декабря 2017 г., 01:41 UTC) отсутствующий тип стал встроенным в Julia. Оригинальный пакет Nulls также был переименован в Missings.
Таким образом, Julia больше подходит для сценариев статистики и анализа данных.
# Version 0.7.0-DEV.3095 (2017-12-19 01:41 UTC)
julia> missing
missing
julia> missing + 1
missing
julia> true | missing
true
julia> false | missing
missing
julia> false & missing
false
julia> true & missing
missing
julia> sum([1,2,3,missing])
missing
julia> sum(skipmissing([1,2,3,missing]))
6