混合数据表
将相关数据存储在单个容器中
您可以使用 table
数据类型来将混合类型的数据和元数据属性(例如变量名称、行名称、说明和变量单位)收集到单个容器中。表适用于列向数据或表格数据,这些数据通常以列形式存储于文本文件或电子表格中。例如,您可以使用表存储试验数据,使用行表示不同的观测对象,使用列表示不同的测量变量。
表由若干行向变量和若干列向变量组成。表中的变量可以有不同数据类型和不同大小,但变量必须有相同的行数。此外,变量中的数据是同构的,这使您能够将表变量视为数据数组。
例如,从 patients.mat
MAT 文件中加载有关患者的样本数据。将血压数据合并到单个变量中。将名为 SelfAssessedHealthStatus
的四个类别变量(其值分别为 Poor
、Fair
、Good
或 Excellent
)转换为分类数组。查看几个变量的相关信息。
load patients 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 624 categorical Smoker 100x1 100 logical
现在,从这些变量创建一个表并显示它。这些变量可以一起存储在一个表中,因为它们都具有相同的行数 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
。
使用数值索引或命名索引访问数据
您可以使用圆括号、花括号或圆点表示法对表进行索引。使用括号可以选择表中的一个数据子集并保留表容器。使用花括号和圆点表示法可以从表中提取数据。在每个表索引方法中,可以通过名称或数值索引指定要访问的行或变量。
考虑上述样本表。表 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
有关表索引的详细信息,请参阅访问表中的数据。
用表属性描述数据
除了存储数据以外,表还具有可用来存储元数据的属性,例如变量名称、行名称、说明和变量单位。您可以使用 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)
T: 100x4 table Description: Simulated Patient Data Variables: Age: double (Yrs) Smoker: logical (34 true, true or false) BloodPressure: 2-column double (Systolic/Diastolic) SelfAssessedHealthStatus: categorical (4 categories, Status Reported by Patient) Statistics for applicable variables: NumMissing Min Median Max Mean Std Age 0 25 39 50 38.2800 7.2154 BloodPressure(:,1) 0 109 122 138 122.7800 6.7128 BloodPressure(:,2) 0 68 81.5000 99 82.9600 6.9325 SelfAssessedHealthStatus 0
与元胞数组比较
元胞数组可以在单个容器中为混合类型的数据提供存储,这一点与表相同。但与表不同是,元胞数组不提供描述其内容的元数据。它不强制其列中的数据保持同构。您无法使用行名称或列名称访问元胞数组的内容。
例如,使用 table2cell
函数将 T
转换为元胞数组。输出元胞数组包含相同的数据,但不包含关于该数据的信息。如果将此类信息附加到数据很重要,那么最好将其存储在表中,而不是存储在元胞数组中。
C = table2cell(T)
C=100×4 cell array
{[38]} {[1]} {[124 93]} {[Excellent]}
{[43]} {[0]} {[109 77]} {[Fair ]}
{[38]} {[0]} {[125 83]} {[Good ]}
{[40]} {[0]} {[117 75]} {[Fair ]}
{[49]} {[0]} {[122 80]} {[Good ]}
{[46]} {[0]} {[121 70]} {[Good ]}
{[33]} {[1]} {[130 88]} {[Good ]}
{[40]} {[0]} {[115 82]} {[Good ]}
{[28]} {[0]} {[115 78]} {[Excellent]}
{[31]} {[0]} {[118 86]} {[Excellent]}
{[45]} {[0]} {[114 77]} {[Excellent]}
{[42]} {[0]} {[115 68]} {[Poor ]}
{[25]} {[0]} {[127 74]} {[Poor ]}
{[39]} {[1]} {[130 95]} {[Excellent]}
{[36]} {[0]} {[114 79]} {[Good ]}
{[48]} {[1]} {[130 92]} {[Good ]}
⋮
要访问元胞数组中的部分数据,只能使用带圆括号或花括号的索引。
C(1:5,1:3)
ans=5×3 cell array
{[38]} {[1]} {[124 93]}
{[43]} {[0]} {[109 77]}
{[38]} {[0]} {[125 83]}
{[40]} {[0]} {[117 75]}
{[49]} {[0]} {[122 80]}
与结构体比较
结构体还可以为混合类型数据提供存储。结构体具有可以通过名称访问的字段,就像可以通过名称访问表变量一样。但是,它并不强制其字段中的数据保持同构。结构体不提供任何元数据来描述其内容。
例如,以类似于表变量的方式将 T
转换为标量结构体,其中每个字段均为一个数组。使用具有 ToScalar
名称-值参量的 table2struct
函数。
S = table2struct(T,ToScalar=true)
S = struct with fields:
Age: [100x1 double]
Smoker: [100x1 logical]
BloodPressure: [100x2 double]
SelfAssessedHealthStatus: [100x1 categorical]
在此结构体中,您可以通过使用字段名称来访问数据数组。
S.Age
ans = 100×1
38
43
38
40
49
46
33
40
28
31
⋮
但是,要访问字段中的部分数据,只能使用数值索引,并且一次只能访问一个字段。使用表行和变量索引可以更灵活地访问表中的数据。
S.Age(1:5)
ans = 5×1
38
43
38
40
49
另请参阅
table
| summary
| table2cell
| table2struct
| readtable