Сообщество Engee

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

Автор
avatar-nkapyrinnkapyrin
Notebook

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

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

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

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

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

A = rand(["молоко", "сок", "вода"], 25)
A = categorical(A, levels=["молоко", "сок", "вода"], ordered=true) # Передаем вектор меток чтобы задать их порядок
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   │ 
───────┼───
молоко │  8
сок    │ 11
вода   │  6

Создадим другой категориальный массив с пожеланиями 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   │ 
───────┼───
вода   │  9
молоко │ 13
сок    │  6

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

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

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

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

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

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

Создадим категориальный массив 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      │ 
──────────┼───
вода      │ 13
газировка │ 18
молоко    │  7
сок       │ 12

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

Объединим данные из 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
сок       │ 29
вода      │ 28
газировка │ 18

Чтобы изменить порядок категорий в категориальном массиве, используем функцию 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}}:
 "сок"
 "вода"
 "молоко"
 "газировка"

Заключение

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