访问表中的数据
表是以变量形式存储列向数据的容器。表变量可以具有不同的数据类型和大小,只要所有变量具有相同的行数即可。表变量有名称,就像结构体的字段有名称一样。表的行可以有名称,但行名称不是必需的。要访问或修改表数据,请使用行和变量的名称或数值索引对其进行索引。
对表进行索引的常见原因包括:
对行和变量重新排序或删除它们。
添加数组作为新的行或变量。
提取数据数组以用作函数的输入参数。
访问或修改表数据的另一种方法是在变量编辑器中打开表以图形方式进行编辑。要打开表,请在工作区浏览器中双击它或使用 openvar
函数。
表索引语法一览
根据您使用的索引类型,您可以访问子表或表中提取的数组。使用以下方式进行索引:
圆括号 () 返回包含指定行和变量的表。
圆点表示法以数组形式返回变量的内容。
花括号 {} 返回由指定行和变量的内容串联而成的数组。
您可以通过名称、数值索引或数据类型指定行和变量。
从 R2019b 开始,变量名称和行名称可以包含任何字符,包括空格和非 ASCII 字符。此外,它们可以由任何字符(而不仅仅是字母)开头。变量名称和行名称可以不是有效的 MATLAB® 标识符(由
isvarname
函数判别)。从 R2022a 开始,当您按名称指定行和变量时,您可以使用
pattern
对象来指定名称。例如,"Var" + digitsPattern
匹配以Var
开头并以任意个数字结尾的所有名称。
输出的类型 | 语法 | 行 | 变量 | 示例 |
---|---|---|---|---|
表,包含指定的行和变量 |
| 指定为:
| 指定为:
|
|
表,包含具有指定数据类型的变量 |
| 指定为:
| 指定为数据类型,如 |
|
数组,包含从一个变量中提取的数据 |
| 未指定 | 指定为:
|
|
数组,包含从一个变量的指定行中提取的数据 |
| 指定为数组的数值索引或逻辑索引 | 指定为:
|
|
数组,串联来自指定的行和变量的数据 |
| 指定为:
| 指定为:
|
|
数组,串联指定行和变量中具有指定数据类型的数据 |
| 指定为:
| 指定为数据类型,如 |
|
数组,串联变量的所有行的数据 |
| 未指定 | 未指定 |
|
使用指定行和变量进行表索引
将 100 位患者的样本数据从 patients
MAT 文件加载到工作区变量中。
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
创建一个表并使用 Age
、Height
、Weight
、Smoker
和 SelfAssessedHealthStatus
工作区变量填充它。将 LastName
中的唯一标识符用作行名称。T
是一个 100×5 表,包含 100 个行和 5 个变量。(当您指定行名称向量时,它不被视为表变量)。此外,将 SelfAssessedHealthStatus
转换为 categorical
变量,因为它只包含唯一值 Excellent
、Good
、Fair
和 Poor
。当一个变量有一组固定的值(您可以将其视为列别)时,将该变量视为 categorical
数组会很有用。
SelfAssessedHealthStatus = categorical(SelfAssessedHealthStatus); T = table(Age,Height,Weight,Smoker,SelfAssessedHealthStatus,... 'RowNames',LastName)
T=100×5 table
Age Height Weight Smoker SelfAssessedHealthStatus
___ ______ ______ ______ ________________________
Smith 38 71 176 true Excellent
Johnson 43 69 163 false Fair
Williams 38 64 131 false Good
Jones 40 67 133 false Fair
Brown 49 64 119 false Good
Davis 46 68 142 false Good
Miller 33 64 142 true Good
Wilson 40 68 180 false Good
Moore 28 68 183 false Excellent
Taylor 31 66 132 false Excellent
Anderson 45 68 128 false Excellent
Thomas 42 66 137 false Poor
Jackson 25 71 174 false Poor
White 39 72 202 true Excellent
Harris 36 65 129 false Good
Martin 48 71 181 true Good
⋮
使用数值索引或 end
关键字建立索引
创建一个包含表 T
中所有变量前五行的子表。要指定所需的行和变量,请使用圆括号内数值索引。这种类型的索引类似于对数值数组进行索引。
firstRows = T(1:5,:)
firstRows=5×5 table
Age Height Weight Smoker SelfAssessedHealthStatus
___ ______ ______ ______ ________________________
Smith 38 71 176 true Excellent
Johnson 43 69 163 false Fair
Williams 38 64 131 false Good
Jones 40 67 133 false Fair
Brown 49 64 119 false Good
您还可以使用 end
关键字来表示最后一行或最后一个变量。使用 end
关键字对表的最后五行进行索引。
lastRows = T(end-4:end,:)
lastRows=5×5 table
Age Height Weight Smoker SelfAssessedHealthStatus
___ ______ ______ ______ ________________________
Alexander 25 69 171 true Good
Russell 44 69 188 true Good
Griffin 49 70 186 false Fair
Diaz 45 68 172 true Good
Hayes 48 66 177 false Fair
除了数值索引,您还可以在圆括号中使用行或变量名称。(在本例中,使用行索引和冒号比使用行或变量名称更紧凑。)
使用名称建立索引
选择姓氏为 Griffin
、Diaz
和 Hayes
的患者的所有数据。由于 T
中的行名称是患者的姓氏,请使用行名称对 T
进行索引。
rowsByName = T(["Griffin","Diaz","Hayes"],:)
rowsByName=3×5 table
Age Height Weight Smoker SelfAssessedHealthStatus
___ ______ ______ ______ ________________________
Griffin 49 70 186 false Fair
Diaz 45 68 172 true Good
Hayes 48 66 177 false Fair
您也可以按名称选择变量。创建一个表,其中只包含 T
中 Height
和 Weight
变量的前五行。显示该表。
variablesByName = T(1:5,["Height","Weight"])
variablesByName=5×2 table
Height Weight
______ ______
Smith 71 176
Johnson 69 163
Williams 64 131
Jones 67 133
Brown 64 119
表变量名称不必是有效的 MATLAB® 标识符。它们可以包括空格和非 ASCII 字符,并且可以由任何字符开头。
例如,使用 renamevars
函数重命名 SelfAssessedHealthStatus
变量。添加空格和短横线,使变量名称更易读。然后使用变量名称对 T
进行索引。
T = renamevars(T,"SelfAssessedHealthStatus","Self-Assessed Health Status"); T(1:5,["Age","Smoker","Self-Assessed Health Status"])
ans=5×3 table
Age Smoker Self-Assessed Health Status
___ ______ ___________________________
Smith 38 true Excellent
Johnson 43 false Fair
Williams 38 false Good
Jones 40 false Fair
Brown 49 false Good
使用模式指定行名称或变量名称
当您指定表行名称或变量名称时,您可以使用定义文本匹配规则的模式。例如,您可以匹配以 "Var"
开头后跟任意数字的变量名称。您可以使用 pattern
对象、字符串和运算符构建模式表达式。
例如,按行名称对 T
进行索引以查找患者姓氏以字母 G
开头的所有行。要匹配 G
后的任何字母,请使用 wildcardPattern
函数。
beginsWithG = "G" + wildcardPattern
beginsWithG = pattern
Matching:
"G" + wildcardPattern
T(beginsWithG,:)
ans=6×5 table
Age Height Weight Smoker Self-Assessed Health Status
___ ______ ______ ______ ___________________________
Garcia 27 69 131 true Fair
Green 44 71 193 false Good
Gonzalez 35 66 118 false Fair
Gray 31 64 130 false Excellent
Gonzales 48 71 174 false Good
Griffin 49 70 186 false Fair
按变量名称对 T
进行索引以查找名称中包含 Status
的任何名称。
containsStatus = wildcardPattern + "Status" + wildcardPattern;
T(1:5,containsStatus)
ans=5×1 table
Self-Assessed Health Status
___________________________
Smith Excellent
Johnson Fair
Williams Good
Jones Fair
Brown Good
按变量的数据类型进行索引
除使用名称或编号指定变量外,您还可以创建一个数据类型下标来匹配具有相同数据类型的所有变量。
首先,通过使用 vartype
函数创建一个数据类型下标来匹配数值表变量。
subscriptObject = vartype("numeric")
subscriptObject = table vartype subscript: Select table variables matching the type 'numeric'
创建一个只包含 T
中数值变量的表。Smoker
变量是逻辑变量,Self-Assessed Health Status
是 categorical
变量,因此它们被排除在外。
onlyNumericVariables = T(:,subscriptObject)
onlyNumericVariables=100×3 table
Age Height Weight
___ ______ ______
Smith 38 71 176
Johnson 43 69 163
Williams 38 64 131
Jones 40 67 133
Brown 49 64 119
Davis 46 68 142
Miller 33 64 142
Wilson 40 68 180
Moore 28 68 183
Taylor 31 66 132
Anderson 45 68 128
Thomas 42 66 137
Jackson 25 71 174
White 39 72 202
Harris 36 65 129
Martin 48 71 181
⋮
查找值符合逻辑条件的行
基于 patients
MAT 文件中的数据创建另一个更小的表。
load patients.mat
T = table(Age,Height,Weight,Smoker);
要查找其中的值满足逻辑条件的表行,请使用逻辑索引。首先使用圆点表示法来访问表变量。然后,您可以根据表变量中的值是否满足您指定的条件来创建一个逻辑索引数组。使用逻辑索引对表进行索引。
使用圆点表示法从表变量中提取数据
要从表变量中提取数据,请使用圆点表示法。
例如,绘制表变量 Weight
中数值的直方图。使用圆点表示法,您可以将 T.Weight
视为数值数组。T.Weight
是包含 100 个行的双精度列向量。
histogram(T.Weight)
title("Patient Weights")
对满足逻辑条件的行进行索引
您可以使用逻辑索引数组对数组或表进行索引。通常,您使用逻辑表达式来确定表变量中的哪些值满足逻辑条件。表达式的结果是一个逻辑索引数组。
例如,创建一个逻辑数组,用于匹配年龄小于 40
的患者。
rows = T.Age < 40
rows = 100x1 logical array
1
0
1
0
0
0
1
0
1
1
⋮
要提取年龄小于 40
的患者的身高数据,请使用 rows
对 Height
变量进行索引。有 56 名患者的年龄小于 40
。
T.Height(rows)
ans = 56×1
71
64
64
68
66
71
72
65
69
69
⋮
您可以用逻辑索引对表进行索引。显示 T
中年龄小于 40
的患者的行。
T(rows,:)
ans=56×4 table
Age Height Weight Smoker
___ ______ ______ ______
38 71 176 true
38 64 131 false
33 64 142 true
28 68 183 false
31 66 132 false
25 71 174 false
39 72 202 true
36 65 129 false
32 69 191 true
27 69 131 true
37 70 179 false
39 64 117 false
28 65 123 true
25 70 189 false
39 63 143 false
25 63 114 false
⋮
您可以用一个逻辑表达式匹配多个条件。显示年龄小于 40
的烟民患者的行。
rows = (T.Smoker==true & T.Age<40); T(rows,:)
ans=18×4 table
Age Height Weight Smoker
___ ______ ______ ______
38 71 176 true
33 64 142 true
39 72 202 true
32 69 191 true
27 69 131 true
28 65 123 true
30 67 186 true
33 66 180 true
39 71 164 true
37 70 194 true
33 67 115 true
31 72 178 true
28 69 189 true
39 68 182 true
37 65 120 true
31 66 141 true
⋮
圆点表示法支持任意变量名称或表达式
使用圆点表示法进行索引时,有两种方式可以指定变量。
使用名称,不带引号。例如,
T.Date
指定名为"Date"
的变量。使用表达式,表达式置于点之后,用圆括号括起。例如,
T.("Start Date")
指定名为"Start Date"
的变量。
当表变量名称碰巧也是有效的 MATLAB® 标识符时,使用第一种语法。(有效的标识符以字母开头,仅包括字母、数字和下划线。)
指定下列各项时使用第二种语法:
指示变量在表中位置的编号。
不是有效 MATLAB 标识符的变量名称。
一个函数,其输出是表中变量的名称,或是添加到表中的变量。函数的输出必须为字符向量或字符串标量。
例如,根据 patients
MAT 文件创建一个表。然后使用圆点表示法来访问表变量的内容。
load patients
T = table(Age,Height,Weight,Smoker);
要按在表中的位置指定变量,请使用编号。Age
是 T
中的第一个变量,因此使用编号 1
来指定其位置。
T.(1)
ans = 100×1
38
43
38
40
49
46
33
40
28
31
⋮
要按名称指定变量,请或者在圆点后指定,或者用引号和圆括号将其括起来。由于 Age
是有效标识符,您可以使用 T.Age
或 T.("Age")
指定它。
T.Age
ans = 100×1
38
43
38
40
49
46
33
40
28
31
⋮
您指定的表变量名称不必是有效的 MATLAB 标识符。变量名称可以包括空格和非 ASCII 字符,并且可以由任何字符开头。但是,当您使用圆点表示法来访问具有此类名称的表变量时,您必须使用引号和圆括号来指定它。
例如,向 T
添加一个带空格和连字符的变量名称。
SelfAssessedHealthStatus = categorical(SelfAssessedHealthStatus); T = addvars(T,SelfAssessedHealthStatus,'NewVariableNames',"Self-Assessed Health Status"); T(1:5,:)
ans=5×5 table
Age Height Weight Smoker Self-Assessed Health Status
___ ______ ______ ______ ___________________________
38 71 176 true Excellent
43 69 163 false Fair
38 64 131 false Good
40 67 133 false Fair
49 64 119 false Good
使用圆点表示法访问新的表变量。显示前五个元素。
healthStatus = T.("Self-Assessed Health Status");
healthStatus(1:5)
ans = 5x1 categorical
Excellent
Fair
Good
Fair
Good
您也可以将函数的输出用作变量名称。删除 T.("Self-Assessed Health Status")
变量。然后将其替换为名称包含当前日期的变量。
T.("Self-Assessed Health Status") = []; T.(string(datetime("today")) + " Self Report") = SelfAssessedHealthStatus; T(1:5,:)
ans=5×5 table
Age Height Weight Smoker 19-Aug-2023 Self Report
___ ______ ______ ______ _______________________
38 71 176 true Excellent
43 69 163 false Fair
38 64 131 false Good
40 67 133 false Fair
49 64 119 false Good
从指定的行和变量中提取数据
使用花括号进行索引会从表中提取数据,并生成数组,而不是子表。但是,除上述差异外,您可以像使用圆括号进行索引时一样,使用编号、名称和数据类型下标来指定行和变量。要从表中提取值,请使用花括号。如果从多个表变量中提取值,则这些变量的数据类型必须支持它们彼此串联。
指定行和变量
基于 patients
文件中的数值和逻辑数组创建一个表。
load patients T = table(Age,Height,Weight,Smoker,... 'RowNames',LastName);
从 T
的多个变量中提取数据。与圆点表示法不同,使用花括号进行索引可以从多个表变量中提取值,并将它们串联成一个数组。
提取前 5 位患者的身高和体重。使用数值索引选择前五行,使用变量名称选择变量 Height
和 Weight
。
A = T{1:5,["Height","Weight"]}
A = 5×2
71 176
69 163
64 131
67 133
64 119
A
是一个 5×2 数值数组,而不是表。
如果您指定一个变量名称,则花括号索引生成的数组与使用圆点表示法得到的数组相同。但是,在使用花括号索引时,必须同时指定行和变量。例如,语法 T.Height
和 T{:,"Height"}
返回相同的数组。
从所有行和变量中提取数据
如果所有表变量的数据类型都支持它们彼此串联,则可以使用 T.Variables
语法将所有表数据放入一个数组中。此语法等效于 T{:,:}
,其中冒号表示所有行和所有变量。如果该表有行名称,则它们不会包含在 T.Variables
的输出中。行名称不存储在表变量中。行名称是描述表的元数据的一部分。
A2 = T.Variables
A2 = 100×4
38 71 176 1
43 69 163 0
38 64 131 0
40 67 133 0
49 64 119 0
46 68 142 0
33 64 142 1
40 68 180 0
28 68 183 0
31 66 132 0
⋮
另请参阅
table
| histogram
| addvars
| vartype
| renamevars