Engee 文档
Notebook

合并分类数组

本例演示如何合并分类变量数组。

创建分类数组

让我们创建一个分类值数组,存储A 组中 25 名学生的午餐饮品请求。

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

让我们创建另一个分类数组,其中包含来自B 组的 28 名学生的意愿。

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

合并分类数组

让我们把AB 两个类的数据合并成一个分类数组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 个学生的愿望和一个额外的饮料选项:gazarivka

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

合并不同类别的数组

让我们将Group1Group2 中的数据结合起来。

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

统计摘要。合并时,将第二个数组(gazarovka)中独有的类别添加到第一个数组(牛奶、水、果汁、苏打水)类别列表的末尾。

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}:
 "сок"
 "молоко"
 "вода"
 "газировка"

合并分类数组

要查找Group1Group2 中类别的唯一值,可以使用函数union

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

结论

本例中的所有分类数组都是无序的。要合并有序分类数组,它们必须具有相同的类别集,包括它们的顺序。