Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

使用分类数组访问数据

按类别选择数据

基于值选择数据通常很有用。此类数据选择涉及基于一个变量中的值创建一个逻辑向量,然后使用该逻辑向量选择另一个变量中的值的子集。您可以创建一个逻辑向量,以便通过查找位于特定范围中的数值数组中的值来选择数据。此外,您可以通过创建特定的离散值来创建逻辑向量。使用分类数组时,您可以轻松地:

  • 选择特定类别的元素。对于分类数组,使用逻辑 ==~= 选择属于或不属于特定类别的数据。要选择一组特定类别的数据,请使用 ismember 函数。

    对于有序分类数组,可以使用不等运算符 >>=<<= 计算特定类别之上或之下的类别中的数据。

  • 删除特定类别的数据。使用逻辑运算符包括或排除特定类别的数据。

  • 查找不属于所定义类别的元素。分类数组指示哪些元素不属于 <undefined> 定义的类别。使用 isundefined 函数查找被测元素中的未定义值。

使用分类数组访问数据的常见方法

此示例演示了如何使用 categorical 数组建立索引和进行搜索。您可以按相似方式使用表中存储的 categorical 数组来访问数据。

加载样本数据

加载从 100 位患者收集的样本数据。

load patients
whos
  Name                            Size            Bytes  Class      Attributes

  Age                           100x1               800  double               
  Diastolic                     100x1               800  double               
  Gender                        100x1             11412  cell                 
  Height                        100x1               800  double               
  LastName                      100x1             11616  cell                 
  Location                      100x1             14208  cell                 
  SelfAssessedHealthStatus      100x1             11540  cell                 
  Smoker                        100x1               100  logical              
  Systolic                      100x1               800  double               
  Weight                        100x1               800  double               

基于字符向量元胞数组创建分类数组

元胞数组 LocationSelfAssessedHealthStatus 包含各类别中的数据。每个元胞数组都包含从一小组唯一值中获取的字符向量(分别表示三个位置和四种健康状况)。要将 LocationSelfAssessedHealthStatus 转换为 categorical 数组,请使用 categorical 函数。

Location = categorical(Location);
SelfAssessedHealthStatus = categorical(SelfAssessedHealthStatus);

搜索单个类别的成员

对于 categorical 数组,可以使用逻辑运算符 ==~= 来查找属于或不属于特定类别的数据。

确定是否存在到 Rampart General Hospital 位置就医的任何患者。

any(Location == "Rampart General Hospital")
ans = logical
   0

不存在到 Rampart General Hospital 就医的患者。

搜索一组类别的成员

您可以使用 ismember 查找一组特定类别中的数据。为到 County General HospitalVA Hospital 就医的患者创建一个逻辑向量。

VA_CountyGenIndex = ...
    ismember(Location,{'County General Hospital','VA Hospital'});

VA_CountyGenIndex 是一个 100×1 的逻辑数组,对于 categorical 数组 Location 中属于 County General HospitalVA Hospital 类别的成员的每个元素,该数组都会在其对应位置包含逻辑值 true (1)。输出 VA_CountyGenIndex 包含 76 个非零元素。

使用逻辑向量 VA_CountyGenIndex 选择在 County General HospitalVA Hospital 就医的患者的 LastName

VA_CountyGenPatients = LastName(VA_CountyGenIndex);

VA_CountyGenPatients 是一个 76×1 的字符向量元胞数组。

选择特定类别中的元素以绘图

使用 summary 函数可输出一份包含每一类别的类别名称及元素数的摘要。

summary(Location)
     County General Hospital       39 
     St. Mary's Medical Center      24 
     VA Hospital                   37 

Location 是一个包含三个类别的 100×1 categorical 数组。County General Hospital 出现在 39 个元素中,St. Mary's Medical Center 出现在 24 个元素中,VA Hospital 出现在 37 个元素中。

使用 summary 函数输出 SelfAssessedHealthStatus 的摘要。

summary(SelfAssessedHealthStatus)
     Excellent      34 
     Fair           15 
     Good           40 
     Poor           11 

SelfAssessedHealthStatus 是一个有四个类别的 100×1 categorical 数组。

使用逻辑运算符 == 访问自我健康状况评估结果为 Good 的患者的年龄。然后利用这些数据绘制一个直方图。

figure()
histogram(Age(SelfAssessedHealthStatus == 'Good'))
title('Ages of Patients with Good Health Status')

Figure contains an axes object. The axes object with title Ages of Patients with Good Health Status contains an object of type histogram.

histogram(Age(SelfAssessedHealthStatus == 'Good')) 绘制报告其健康状况为 Good 的 40 名患者的年龄数据。

删除特定类别中的数据

您可以使用逻辑运算符包括或排除特定类别中的数据。删除工作区变量 AgeLocation 中到 VA Hospital 就医的所有患者。

Age = Age(Location ~= "VA Hospital");
Location = Location(Location ~= "VA Hospital");

现在,Age 是一个 63×1 的数值数组,Location 是一个 63×1 的 categorical 数组。

列出 Location 的类别以及每个类别中的元素数。

summary(Location)
     County General Hospital       39 
     St. Mary's Medical Center      24 
     VA Hospital                    0 

VA Hospital 就医的患者已从 Location 中删除,但 VA Hospital 仍是一个类别。

使用 removecats 函数从 Location 的类别中删除 VA Hospital

Location = removecats(Location,"VA Hospital");

验证 VA Hospital 类别是否已删除。

categories(Location)
ans = 2x1 cell
    {'County General Hospital'  }
    {'St. Mary's Medical Center'}

Location 是一个包含两个类别的 63×1 categorical 数组。

删除元素

您可以按索引删除元素。例如,您可以通过使用 Location(2:end) 选择其余元素来删除 Location 的第一个元素。不过,更简单的元素删除方式是使用 []

Location(1) = [];
summary(Location)
     County General Hospital       38 
     St. Mary's Medical Center      24 

Location 是一个包含两个类别的 62×1 categorical 数组。删除第一个元素对同一类别中的其他元素没有任何影响,并且不会删除该类别本身。

测试未定义元素

Location 中删除类别 County General Hospital

Location = removecats(Location,"County General Hospital");

显示 categorical 数组 Location 的前八个元素。

Location(1:8)
ans = 8x1 categorical
     St. Mary's Medical Center 
     <undefined> 
     St. Mary's Medical Center 
     St. Mary's Medical Center 
     <undefined> 
     <undefined> 
     St. Mary's Medical Center 
     St. Mary's Medical Center 

删除 County General Hospital 类别后,先前属于该类别的元素不再属于为 Location 定义的任何类别。不属于任何类别的 categorical 元素是未定义的,其值显示为 <undefined>

使用函数 isundefined 查找 categorical 数组中不属于任何类别的元素。

undefinedIndex = isundefined(Location);

undefinedIndex 是一个 62×1 的 categorical 数组,其中与 Location 中所有未定义元素相对应的位置均包含逻辑值 true (1)。

设置未定义的元素

使用 summary 函数输出 Location 中未定义的元素数量。

summary(Location)
     St. Mary's Medical Center      24 
     <undefined>                   38 

Location 的第一个元素属于 St. Mary's Medical Center 类别。将第一个元素设置为未定义值,使其不再属于任何类别。通过将 ''""'<undefined>'string(nan)missing 指定为元素,您可以在 categorical 数组中创建未定义元素。当您将这样的值赋给 categorical 数组的元素时,它会将它们转换为未定义的值。

Location(1) = "";
summary(Location)
     St. Mary's Medical Center      23 
     <undefined>                   39 

您可以将选定元素设置为 undefined 而不删除类别或更改其他元素的类别。设置未定义元素以用于指示具有未知值的元素。

预分配包含未定义元素的分类数组

您可以使用未定义的元素预分配 categorical 数组的大小,以提高性能。创建一个 categorical 数组,其中仅包含具有已知位置的元素。

definedIndex = ~isundefined(Location);
newLocation = Location(definedIndex);
summary(newLocation)
     St. Mary's Medical Center      23 

扩展 newLocation 的大小,使其成为一个 200×1 的 categorical 数组。将最后一个新元素设置为未定义元素。所有其他新元素也被赋予未定义的值。23 个原始元素将保留它们已有的值。

newLocation(200) = "";
summary(newLocation)
     St. Mary's Medical Center       23 
     <undefined>                   177 

newLocation 可为您计划以后存储到数组中的值留出空间。

另请参阅

| | | | | |

相关示例

详细信息