使用表的好处
方便将混合类型的数据存储于单个容器中
您可以使用 table
数据类型来将混合类型的数据和元数据属性(例如变量名称、行名称、说明和变量单位)收集到单个容器中。表适用于列向数据或表格数据,这些数据通常以列形式存储于文本文件或电子表格中。例如,您可以使用表存储试验数据,使用行表示不同的观测对象,使用列表示不同的测量变量。
表由若干行向变量和若干列向变量组成。表中的每个变量可以具有不同的数据类型和不同的大小,但每个变量必须具有相同的行数。
例如,加载样本患者数据。
load patients
然后,将工作区变量 Systolic
和 Diastolic
合并为单个 BloodPressure
变量,并将工作区变量 SelfAssessedHealthStatus
从字符向量元胞数组转换为 categorical
数组。
BloodPressure = [Systolic Diastolic]; SelfAssessedHealthStatus = categorical(SelfAssessedHealthStatus); whos("Age","Smoker","BloodPressure","SelfAssessedHealthStatus")
Name Size Bytes Class Attributes Age 100x1 800 double BloodPressure 100x2 1600 double SelfAssessedHealthStatus 100x1 560 categorical Smoker 100x1 100 logical
变量 Age
、BloodPressure
、SelfAssessedHealthStatus
和 Smoker
具有不同的数据类型,是要存储于表中的候选对象,因为它们都具有相同的行数 100。
现在,从变量创建一个表并显示它。
T = table(Age,Smoker,BloodPressure,SelfAssessedHealthStatus)
T=100×4 table
Age Smoker BloodPressure SelfAssessedHealthStatus
___ ______ _____________ ________________________
38 true 124 93 Excellent
43 false 109 77 Fair
38 false 125 83 Good
40 false 117 75 Fair
49 false 122 80 Good
46 false 121 70 Good
33 true 130 88 Good
40 false 115 82 Good
28 false 115 78 Excellent
31 false 118 86 Excellent
45 false 114 77 Excellent
42 false 115 68 Poor
25 false 127 74 Poor
39 true 130 95 Excellent
36 false 114 79 Good
48 true 130 92 Good
⋮
该表以表格形式显示,并且变量名称位于顶部。
表中的每个变量都是一个单独的数据类型。如果向表中添加一个新行,MATLAB® 将强制使新数据与对应的表变量的数据类型保持一致。例如,如果您尝试添加新患者的信息,其中第一列包含患者的健康状况而不是年龄(如表达式 T(end+1,:) = {"Poor",true,[130 84],37}
中一样),则会出现错误:
Right hand side of an assignment to a categorical array must be a categorical or text representing a category name.
出现错误的原因是 MATLAB® 不能将数值数据 37
赋给分类数组 SelfAssessedHealthStatus
。
为了便于比较表和结构体,假设一个结构体数组 StructArray
,它等效于表 T
。
StructArray = table2struct(T)
StructArray=100×1 struct array with fields:
Age
Smoker
BloodPressure
SelfAssessedHealthStatus
结构体数组使用命名字段组织记录。每个字段的值都具有不同的数据类型或大小。现在,显示 StructArray
的第一个元素的命名字段。
StructArray(1)
ans = struct with fields:
Age: 38
Smoker: 1
BloodPressure: [124 93]
SelfAssessedHealthStatus: Excellent
结构体数组中的字段与表中的变量相似。但是,与表不同的是,结构体数组不能在字段中强制实施同质化要求。例如,有些 S.SelfAssessedHealthStatus
值是分类数组元素,如 Poor
或 Good
,有些是字符串,如 "Poor"
和 "Good"
,还有一些是整数,如 0
或 1
。
现在假设在一个标量结构体中存储的相同数据,四个字段,每一个包含表中的一个变量。
ScalarStruct = struct(... "Age",Age,... "Smoker",Smoker,... "BloodPressure",BloodPressure,... "SelfAssessedHealthStatus",SelfAssessedHealthStatus)
ScalarStruct = struct with fields:
Age: [100x1 double]
Smoker: [100x1 logical]
BloodPressure: [100x2 double]
SelfAssessedHealthStatus: [100x1 categorical]
与表不同,您不能强制使这些数据保持矩形结构。例如,字段 ScalarStruct.Age
的长度可能不同于其他字段。
使用表可以保持矩形结构体(类似于结构体数组)并强制使变量保持同质(类似于标量结构体中的字段)。尽管元胞数组没有命名字段,但它们与结构体数组和标量结构体一样具有许多相同的不足之处。如果每个变量中的矩形数据是同质的,请考虑使用表。然后便可使用数值或命名索引,还可以使用表属性存储元数据。
使用数值索引或命名索引访问数据
您可以使用圆括号、花括号或点索引对表进行索引。使用括号可以选择表中的一个数据子集并保留表容器。使用花括号和点索引可以从表中提取数据。在每个表索引方法中,可以通过名称或数值索引指定要访问的行或变量。
考虑上述样本表。表 T
中的每一行表示一位不同的患者。工作区变量 LastName
包含这 100 行数据的唯一标识符。通过将 RowNames
属性设置为 LastName
来向表中添加行名称,并显示更新后的表的前五行。
T.Properties.RowNames = LastName; T(1:5,:)
ans=5×4 table
Age Smoker BloodPressure SelfAssessedHealthStatus
___ ______ _____________ ________________________
Smith 38 true 124 93 Excellent
Johnson 43 false 109 77 Fair
Williams 38 false 125 83 Good
Jones 40 false 117 75 Fair
Brown 49 false 122 80 Good
除了为表添加标签,还可以使用行和变量名称访问表中的数据。例如,使用命名索引显示患者 Williams
和 Brown
的年龄和血压。
T(["Williams","Brown"],["Age","BloodPressure"])
ans=2×2 table
Age BloodPressure
___ _____________
Williams 38 125 83
Brown 49 122 80
现在,使用数组索引返回一个等效的子表。从第一个和第三个变量中返回第三行和第五行。
T([3 5],[1 3])
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 = ... ["" ... "true or false" ... "Systolic/Diastolic" ... "Status Reported by Patient"]; T.Properties.VariableUnits("Age") = "Yrs";
VariableDescriptions
内的单个空字符串表示对应的变量没有描述。有关详细信息,请参阅 table
的“属性”部分。
要打印表摘要,请使用 summary
函数。
summary(T)
Description: Simulated Patient Data Variables: 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 SelfAssessedHealthStatus: 100x1 categorical Properties: Description: Status Reported by Patient Values: Excellent 34 Fair 15 Good 40 Poor 11
结构体和元胞数组没有用于存储元数据的属性。