方便将混合类型的数据存储于单个容器中
您可以使用 table 数据类型来将混合类型的数据和元数据属性(例如变量名称、行名称、说明和变量单位)收集到单个容器中。表适用于列向数据或表格数据,这些数据通常以列形式存储于文本文件或电子表格中。例如,您可以使用表存储试验数据,使用行表示不同的观测对象,使用列表示不同的测量变量。
表由若干行向变量和若干列向变量组成。表中的每个变量可以具有不同的数据类型和不同的大小,但每个变量必须具有相同的行数。
例如,加载样本患者数据。
load patients
然后,将工作区变量 Systolic 和 Diastolic 合并为单个 BloodPressure 变量,并将工作区变量 Gender 从字符向量元胞数组转换为分类数组。
BloodPressure = [Systolic Diastolic];
Gender = categorical(Gender);
whos('Gender','Age','Smoker','BloodPressure')
Name Size Bytes Class Attributes
Age 100x1 800 double
BloodPressure 100x2 1600 double
Gender 100x1 330 categorical
Smoker 100x1 100 logical
变量 Age、BloodPressure、Gender 和 Smoker 具有不同的数据类型,是要存储于表中的候选对象,因为它们都具有相同的行数 100。
现在,基于这些变量创建一个表并显示前五行。
T = table(Gender,Age,Smoker,BloodPressure);
T(1:5,:)
ans=5×4 table
Gender Age Smoker BloodPressure
______ ___ ______ _____________
Male 38 true 124 93
Male 43 false 109 77
Female 38 false 125 83
Female 40 false 117 75
Female 49 false 122 80
该表以表格形式显示,并且变量名称位于顶部。
表中的每个变量都是一个单独的数据类型。如果向表中添加一个新行,MATLAB® 将强制使新数据与对应的表变量的数据类型保持一致。例如,如果您尝试添加新患者的信息,其中第一列包含患者的年龄而不是性别(如表达式 T(end+1,:) = {37,{‘Female’},true,[130 84]} 中一样),则会出现错误:
Invalid RHS for assignment to a categorical array.
出现错误的原因是 MATLAB® 不能将数值数据 37 赋给分类数组 Gender。
为了便于比较表和结构体,假设一个结构体数组 StructArray,它等效于表 T。
StructArray = table2struct(T)
StructArray=100×1 struct array with fields:
Gender
Age
Smoker
BloodPressure
结构体数组使用命名字段组织记录。每个字段的值都具有不同的数据类型或大小。现在,显示 StructArray 的第一个元素的命名字段。
StructArray(1)
ans = struct with fields:
Gender: Male
Age: 38
Smoker: 1
BloodPressure: [124 93]
结构体数组中的字段与表中的变量相似。但是,与表不同的是,结构体数组不能在字段中强制实施同质化要求。例如,S.Gender 的一些值可能为分类数组元素 Male 或 Female,另一些值可能为字符向量 ‘Male’ 或 ‘Female’,其他一些值可能为整数 0 或 1。
现在假设在一个标量结构体中存储的相同数据,四个字段,每一个包含表中的一个变量。
ScalarStruct = struct(...
'Gender',{Gender},...
'Age',Age,...
'Smoker',Smoker,...
'BloodPressure',BloodPressure)
ScalarStruct = struct with fields:
Gender: [100x1 categorical]
Age: [100x1 double]
Smoker: [100x1 logical]
BloodPressure: [100x2 double]
与表不同,您不能强制使这些数据保持矩形结构。例如,字段 ScalarStruct.Age 的长度可能不同于其他字段。
使用表可以保持矩形结构体(类似于结构体数组)并强制使变量保持同质(类似于标量结构体中的字段)。尽管元胞数组没有命名字段,但它们与结构体数组和标量结构体一样具有许多相同的不足之处。如果每个变量中的矩形数据是同质的,请考虑使用表。然后便可使用数值或命名索引,还可以使用表属性存储元数据。
使用数值索引或命名索引访问数据
您可以使用圆括号、花括号或点索引对表进行索引。使用括号可以选择表中的一个数据子集并保留表容器。使用花括号和点索引可以从表中提取数据。在每个表索引方法中,可以通过名称或数值索引指定要访问的行或变量。
考虑上述样本表。表 T 中的每一行表示一位不同的患者。工作区变量 LastName 包含这 100 行数据的唯一标识符。通过将 RowNames 属性设置为 LastName 来向表中添加行名称,并显示更新后的表的前五行。
T.Properties.RowNames = LastName;
T(1:5,:)
ans=5×4 table
Gender Age Smoker BloodPressure
______ ___ ______ _____________
Smith Male 38 true 124 93
Johnson Male 43 false 109 77
Williams Female 38 false 125 83
Jones Female 40 false 117 75
Brown Female 49 false 122 80
除了为表添加标签,还可以使用行和变量名称访问表中的数据。例如,使用命名索引显示患者 Williams 和 Brown 的年龄和血压。
T({'Williams','Brown'},{'Age','BloodPressure'})
ans=2×2 table
Age BloodPressure
___ _____________
Williams 38 125 83
Brown 49 122 80
现在,使用数组索引返回一个等效的子表。返回第二和第四个变量中的第三和第四行。
T(3:2:5,2:2:4)
ans=2×2 table
Age BloodPressure
___ _____________
Williams 38 125 83
Brown 49 122 80
使用元胞数组或结构体时,不能如此灵活地使用命名索引或数值索引。
使用元胞数组时,必须使用 strcmp 查找所需的命名数据,然后才可以对数组进行索引。
使用标量结构体或结构体数组时,不能按编号引用字段。此外,使用标量结构体时,不能很轻松地选择变量子集或观测值子集。使用结构体数组时,可以选择观测值子集,但不能选择变量子集。
使用表时,可以根据命名索引或数值索引访问数据。此外,可以轻松地选择变量子集和行子集。
有关表索引的详细信息,请参阅访问表中的数据。
使用表属性存储元数据
除了存储数据以外,表还具有可用来存储元数据的属性,例如变量名称、行名称、说明和变量单位。您可以使用 T.Properties.PropName 访问属性,其中 T 为表名称,PropName 为其中一个表属性。
例如,为 Age 添加表说明、变量说明和变量单位。
T.Properties.Description = 'Simulated Patient Data';
T.Properties.VariableDescriptions = ...
{'Male or Female' ...
'' ...
'true or false' ...
'Systolic/Diastolic'};
T.Properties.VariableUnits{'Age'} = 'Yrs';
VariableDescriptions 的元胞数组中的各个空字符向量指示对应的变量没有说明。有关详细信息,请参阅 table 的“属性”部分。
要打印表摘要,请使用 summary 函数。
summary(T)
Description: Simulated Patient Data
Variables:
Gender: 100x1 categorical
Properties:
Description: Male or Female
Values:
Female 53
Male 47
Age: 100x1 double
Properties:
Units: Yrs
Values:
Min 25
Median 39
Max 50
Smoker: 100x1 logical
Properties:
Description: true or false
Values:
True 34
False 66
BloodPressure: 100x2 double
Properties:
Description: Systolic/Diastolic
Values:
Column 1 Column 2
________ ________
Min 109 68
Median 122 81.5
Max 138 99
结构体和元胞数组没有用于存储元数据的属性。