Документация Engee
Notebook

Объединение категориальных массивов

Этот пример показывает, как объединять массивы категориальных переменных.

Создание категориальных массивов

Создадим массив категориальных значений, где хранятся пожеланиям по напиткам на обеденный перерыв для 25 студентов в группе A.

In [ ]:
using Random, CategoricalArrays
Random.seed!(123)

A = rand(1:3, 25)
A = categorical(A, levels=[1,2,3], labels=["молоко", "сок", "вода"]) # Назначаем метки значениям вручную
Out[0]:
25-element CategoricalArray{String,1,UInt32}:
 "сок"
 "сок"
 "вода"
 "молоко"
 "сок"
 "сок"
 "молоко"
 "вода"
 "сок"
 "молоко"
 "сок"
 "вода"
 "молоко"
 "сок"
 "сок"
 "молоко"
 "вода"
 "сок"
 "сок"
 "молоко"
 "молоко"
 "вода"
 "вода"
 "молоко"
 "сок"

Сводная статистика по категориальному массиву:

In [ ]:
Pkg.add( "FreqTables" )
In [ ]:
using FreqTables
freqtable(A)
Out[0]:
3-element Named Vector{Int64}
Dim1   │ 
───────┼───
вода   │  6
молоко │  8
сок    │ 11

Создадим другой категориальный массив с пожеланиями 28 студентов из группы B.

In [ ]:
B = rand(["молоко", "сок", "вода"], 28) # Более сжатый синтаксис
B = categorical(B)
Out[0]:
28-element CategoricalArray{String,1,UInt32}:
 "сок"
 "вода"
 "вода"
 "вода"
 "вода"
 "вода"
 "сок"
 "сок"
 "молоко"
 "сок"
 "сок"
 "сок"
 "вода"
 ⋮
 "вода"
 "молоко"
 "вода"
 "вода"
 "вода"
 "вода"
 "сок"
 "сок"
 "молоко"
 "сок"
 "вода"
 "вода"

Сводная статистика:

In [ ]:
freqtable(B)
Out[0]:
3-element Named Vector{Int64}
Dim1   │ 
───────┼───
вода   │ 14
молоко │  3
сок    │ 11

Объединение категориальных массивов

Объединим данные из классов A и B в один категориальный массив Group1.

In [ ]:
Group1 = [A; B]
Out[0]:
53-element CategoricalArray{String,1,UInt32}:
 "сок"
 "сок"
 "вода"
 "молоко"
 "сок"
 "сок"
 "молоко"
 "вода"
 "сок"
 "молоко"
 "сок"
 "вода"
 "молоко"
 ⋮
 "вода"
 "молоко"
 "вода"
 "вода"
 "вода"
 "вода"
 "сок"
 "сок"
 "молоко"
 "сок"
 "вода"
 "вода"

Сводная статистика:

In [ ]:
freqtable(Group1)
Out[0]:
3-element Named Vector{Int64}
Dim1   │ 
───────┼───
вода   │ 20
молоко │ 11
сок    │ 22

Создание категориального массива с другими категориями

Создадим категориальный массив Group2, содержащий пожелания 50 студентов с дополнительным вариантом напитка: газировка.

In [ ]:
Group2 = rand(["сок", "молоко", "газировка", "вода"], 50)
Group2 = categorical( Group2 )
Out[0]:
50-element CategoricalArray{String,1,UInt32}:
 "сок"
 "сок"
 "сок"
 "сок"
 "газировка"
 "газировка"
 "молоко"
 "газировка"
 "молоко"
 "газировка"
 "вода"
 "газировка"
 "сок"
 ⋮
 "сок"
 "вода"
 "газировка"
 "газировка"
 "газировка"
 "газировка"
 "сок"
 "газировка"
 "вода"
 "сок"
 "сок"
 "газировка"

Сводная статистика:

In [ ]:
freqtable(Group2)
Out[0]:
4-element Named Vector{Int64}
Dim1      │ 
──────────┼───
вода      │  8
газировка │ 19
молоко    │  6
сок       │ 17

Объединение массивов с разными категориями

Объединим данные из Group1 и Group2.

In [ ]:
students = [Group1; Group2]
Out[0]:
103-element CategoricalArray{String,1,UInt32}:
 "сок"
 "сок"
 "вода"
 "молоко"
 "сок"
 "сок"
 "молоко"
 "вода"
 "сок"
 "молоко"
 "сок"
 "вода"
 "молоко"
 ⋮
 "сок"
 "вода"
 "газировка"
 "газировка"
 "газировка"
 "газировка"
 "сок"
 "газировка"
 "вода"
 "сок"
 "сок"
 "газировка"

Сводная статистика. При объединении категории, уникальные для второго массива (газировка), добавляются в конец списка категорий первого массива (молоко, вода, сок, газировка).

In [ ]:
freqtable(students)
Out[0]:
4-element Named Vector{Int64}
Dim1      │ 
──────────┼───
вода      │ 28
газировка │ 19
молоко    │ 17
сок       │ 39

Чтобы изменить порядок категорий в категориальном массиве, используем функцию levels!.

In [ ]:
levels!(students, ["сок", "молоко", "вода", "газировка"])
levels(students)
Out[0]:
4-element Vector{String}:
 "сок"
 "молоко"
 "вода"
 "газировка"

Объединение категориальных массивов

Чтобы найти уникальные значения категорий, присутствующих в Group1 и Group2, можно использовать функцию union.

In [ ]:
C = union(Group1, Group2)
Out[0]:
4-element Vector{CategoricalValue{String, UInt32}}:
 "сок"
 "вода"
 "молоко"
 "газировка"

Заключение

Все категориальные массивы в этом примере были неупорядоченными. Для объединения упорядоченных категориальных массивов они должны иметь одинаковые наборы категорий, включая их порядок.