访问表中的数据
表是以变量形式存储列向数据的容器。要访问表中的数据,可以通过指定行和变量对表进行索引,就像通过指定行和列对矩阵进行索引一样。表变量有名称,就像结构体的字段有名称一样。表的行也可以有名称,但行名称不是必需的。要对表进行索引,请使用位置、名称或数据类型指定行和变量。结果可以是数组或表。
本主题介绍不同表索引语法以及何时使用每种语法类型。其他示例说明应用这些表索引类型的不同方式。本主题末尾的表摘要显示了索引语法、如何指定行和变量以及生成的输出。
表索引语法
根据您使用的索引类型,结果或者是从表中提取的一个数组,或者是一个新表。使用以下方式进行索引:
圆点表示法,如
T.
或varname
T.(
所示,从一个表变量中提取一个数组。expression
)花括号,如
T{
中所示,从指定的行和变量中提取一个数组。各变量必须具有兼容的数据类型,以便它们可以串联成一个数组。rows
,vars
}圆括号,如
T(
中所示,返回一个只包含指定行和变量的表。rows
,vars
)
此图显示三种类型的表索引。
推荐的索引语法
访问表内容的推荐方法取决于所需的结果和指定的变量数目。在这些语法示例中,T
是包含名为 Var1
、Var2
和 Var3
的变量的表。(如果在调用 table
函数时没有指定变量名称,则这些名称是默认名称。)
T = table([1;2;3;4;5],[5;10;15;20;25],[150;300;450;600;750])
要访问一个表变量,请使用圆点表示法。指定与变量的名称或位置匹配的变量名称或表达式。
使用变量的字面名称比使用表达式更快。例如,
T.Var1
和T.(1)
都访问T
的第一个变量,但使用表达式会更慢。X = T.Var1 Y = T.Var1(1:3) Z = T.(1) T.Var1 = T.Var1 .* 10
您也可以使用花括号指定一个变量。但是,使用圆点表示法访问变量比使用花括号访问变量更快。
要访问多个表变量,请使用花括号。
X = T{:,["Var1","Var2"]} Y = T{1:3,["Var1","Var2"]} T{:,["Var1","Var2"]} = T{:,["Var1","Var2"]} .* 10
要返回只包含指定行和变量的表,请使用圆括号。
T2 = T(:,["Var1","Var2"]) T2 = T(1:3,["Var1","Var2"]) A = rand(5,1) B = rand(5,1) T(:,["Var1","Var2"]) = table(A,B)
通过指定行和变量进行索引
您可以通过指定数值索引、行和变量名称或变量数据类型对表进行索引。
创建一个表。从示例 patients.mat
文件中加载数据数组。然后使用 table
函数从这些数组创建一个表。输入数组的名称成为表变量的名称。行名称是可选的。要指定行名称,请使用 RowNames
名称-值参量。
load patients.mat Age Height Weight Smoker LastName T = table(Age,Height,Weight,Smoker,RowNames=LastName)
T=100×4 table
Age Height Weight Smoker
___ ______ ______ ______
Smith 38 71 176 true
Johnson 43 69 163 false
Williams 38 64 131 false
Jones 40 67 133 false
Brown 49 64 119 false
Davis 46 68 142 false
Miller 33 64 142 true
Wilson 40 68 180 false
Moore 28 68 183 false
Taylor 31 66 132 false
Anderson 45 68 128 false
Thomas 42 66 137 false
Jackson 25 71 174 false
White 39 72 202 true
Harris 36 65 129 false
Martin 48 71 181 true
⋮
按位置进行索引
您可以通过将位置指定为数值索引对表进行索引。您还可以使用冒号和 end
关键字。
例如,对 T
的前三行进行索引。此语法是返回具有指定行数的表的一种简洁方式。
firstRows = T(1:3,:)
firstRows=3×4 table
Age Height Weight Smoker
___ ______ ______ ______
Smith 38 71 176 true
Johnson 43 69 163 false
Williams 38 64 131 false
返回包含 T
的前两个变量和最后三行的表。
lastRows = T(end-2:end,1:2)
lastRows=3×2 table
Age Height
___ ______
Griffin 49 70
Diaz 45 68
Hayes 48 66
如果变量具有兼容的数据类型,则可以使用花括号将提取的数据以一个数组形式返回。
lastRowsAsArray = T{end-2:end,1:2}
lastRowsAsArray = 3×2
49 70
45 68
48 66
按变量名称进行索引
您可以通过使用字符串数组指定变量名称对表进行索引。表变量名称不必是有效的 MATLAB® 标识符。它们可以包括空格和非 ASCII 字符,并且可以由任何字符开头。
例如,返回一个表,其中只包含 T
中的 Height
和 Weight
变量的前三行。
variablesByName = T(1:3,["Height","Weight"])
variablesByName=3×2 table
Height Weight
______ ______
Smith 71 176
Johnson 69 163
Williams 64 131
使用花括号将数据以数组形式返回。
arraysFromVariables = T{1:3,["Height","Weight"]}
arraysFromVariables = 3×2
71 176
69 163
64 131
您也可以使用圆点表示法对一个变量进行索引。事实上,在只访问一个变量时,圆点表示法会更高效。
heightAsArray = T.Height
heightAsArray = 100×1
71
69
64
67
64
68
64
68
68
66
⋮
使用圆点表示法将 Height
变量的前三行以一个数组形式返回。
firstHeights = T.Height(1:3)
firstHeights = 3×1
71
69
64
按行名称进行索引
如果表有行名称,您可以按行名称而不仅仅是行号对它进行索引。例如,返回 T
中对应三个特定患者的行。
rowsByName = T(["Griffin","Diaz","Hayes"],:)
rowsByName=3×4 table
Age Height Weight Smoker
___ ______ ______ ______
Griffin 49 70 186 false
Diaz 45 68 172 true
Hayes 48 66 177 false
您也可以使用花括号将数据以数组形式返回。
arraysFromRows = T{["Griffin","Diaz","Hayes"],:}
arraysFromRows = 3×4
49 70 186 0
45 68 172 1
48 66 177 0
对一个元素进行索引
要对表的一个元素进行索引,请指定一行和一个变量。使用花括号将该元素以一个数组形式返回,在本例中是一个标量值。
oneElement = T{"Diaz","Height"}
oneElement = 68
要将该元素以具有一行和一个变量的表形式返回,请使用圆括号。
oneElementTable = T("Diaz","Height")
oneElementTable=table
Height
______
Diaz 68
按变量数据类型进行索引
要通过指定具有相同数据类型的变量对表进行索引,请使用 vartype
函数创建一个数据类型下标。
例如,创建一个数据类型下标来匹配数值表变量。
numSubscript = vartype("numeric")
numSubscript = table vartype subscript: Select table variables matching the type 'numeric'
返回一个只包含 T
的数值变量的表。不包括 Smoker
变量,因为它是逻辑变量。
onlyNumVariables = T(:,numSubscript)
onlyNumVariables=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
⋮
为表赋值
您可以使用任何索引语法为表赋值。您可以为变量、行或各个元素赋值。
为变量赋值
使用 readtable
函数将停电数据从电子表格导入表中。
outages = readtable("outages.csv",TextType="string")
outages=1468×6 table
Region OutageTime Loss Customers RestorationTime Cause
___________ ________________ ______ __________ ________________ _________________
"SouthWest" 2002-02-01 12:18 458.98 1.8202e+06 2002-02-07 16:50 "winter storm"
"SouthEast" 2003-01-23 00:49 530.14 2.1204e+05 NaT "winter storm"
"SouthEast" 2003-02-07 21:15 289.4 1.4294e+05 2003-02-17 08:14 "winter storm"
"West" 2004-04-06 05:44 434.81 3.4037e+05 2004-04-06 06:10 "equipment fault"
"MidWest" 2002-03-16 06:18 186.44 2.1275e+05 2002-03-18 23:23 "severe storm"
"West" 2003-06-18 02:49 0 0 2003-06-18 10:54 "attack"
"West" 2004-06-20 14:39 231.29 NaN 2004-06-20 19:16 "equipment fault"
"West" 2002-06-06 19:28 311.86 NaN 2002-06-07 00:51 "equipment fault"
"NorthEast" 2003-07-16 16:23 239.93 49434 2003-07-17 01:12 "fire"
"MidWest" 2004-09-27 11:09 286.72 66104 2004-09-27 16:37 "equipment fault"
"SouthEast" 2004-09-05 17:48 73.387 36073 2004-09-05 20:46 "equipment fault"
"West" 2004-05-21 21:45 159.99 NaN 2004-05-22 04:23 "equipment fault"
"SouthEast" 2002-09-01 18:22 95.917 36759 2002-09-01 19:12 "severe storm"
"SouthEast" 2003-09-27 07:32 NaN 3.5517e+05 2003-10-04 07:02 "severe storm"
"West" 2003-11-12 06:12 254.09 9.2429e+05 2003-11-17 02:04 "winter storm"
"NorthEast" 2004-09-18 05:54 0 0 NaT "equipment fault"
⋮
要为一个变量赋值,请使用圆点表示法。例如,将 Loss
变量按因子 100 进行缩放。
outages.Loss = outages.Loss .* 100
outages=1468×6 table
Region OutageTime Loss Customers RestorationTime Cause
___________ ________________ ______ __________ ________________ _________________
"SouthWest" 2002-02-01 12:18 45898 1.8202e+06 2002-02-07 16:50 "winter storm"
"SouthEast" 2003-01-23 00:49 53014 2.1204e+05 NaT "winter storm"
"SouthEast" 2003-02-07 21:15 28940 1.4294e+05 2003-02-17 08:14 "winter storm"
"West" 2004-04-06 05:44 43481 3.4037e+05 2004-04-06 06:10 "equipment fault"
"MidWest" 2002-03-16 06:18 18644 2.1275e+05 2002-03-18 23:23 "severe storm"
"West" 2003-06-18 02:49 0 0 2003-06-18 10:54 "attack"
"West" 2004-06-20 14:39 23129 NaN 2004-06-20 19:16 "equipment fault"
"West" 2002-06-06 19:28 31186 NaN 2002-06-07 00:51 "equipment fault"
"NorthEast" 2003-07-16 16:23 23993 49434 2003-07-17 01:12 "fire"
"MidWest" 2004-09-27 11:09 28672 66104 2004-09-27 16:37 "equipment fault"
"SouthEast" 2004-09-05 17:48 7338.7 36073 2004-09-05 20:46 "equipment fault"
"West" 2004-05-21 21:45 15999 NaN 2004-05-22 04:23 "equipment fault"
"SouthEast" 2002-09-01 18:22 9591.7 36759 2002-09-01 19:12 "severe storm"
"SouthEast" 2003-09-27 07:32 NaN 3.5517e+05 2003-10-04 07:02 "severe storm"
"West" 2003-11-12 06:12 25409 9.2429e+05 2003-11-17 02:04 "winter storm"
"NorthEast" 2004-09-18 05:54 0 0 NaT "equipment fault"
⋮
您还可以使用花括号将数据赋给多个变量。这些变量必须具有兼容的数据类型。例如,将 Loss
和 Customers
按因子 1/10,000 进行缩放。
outages{:,["Loss","Customers"]} = outages{:,["Loss","Customers"]} ./ 10000
outages=1468×6 table
Region OutageTime Loss Customers RestorationTime Cause
___________ ________________ _______ _________ ________________ _________________
"SouthWest" 2002-02-01 12:18 4.5898 182.02 2002-02-07 16:50 "winter storm"
"SouthEast" 2003-01-23 00:49 5.3014 21.204 NaT "winter storm"
"SouthEast" 2003-02-07 21:15 2.894 14.294 2003-02-17 08:14 "winter storm"
"West" 2004-04-06 05:44 4.3481 34.037 2004-04-06 06:10 "equipment fault"
"MidWest" 2002-03-16 06:18 1.8644 21.275 2002-03-18 23:23 "severe storm"
"West" 2003-06-18 02:49 0 0 2003-06-18 10:54 "attack"
"West" 2004-06-20 14:39 2.3129 NaN 2004-06-20 19:16 "equipment fault"
"West" 2002-06-06 19:28 3.1186 NaN 2002-06-07 00:51 "equipment fault"
"NorthEast" 2003-07-16 16:23 2.3993 4.9434 2003-07-17 01:12 "fire"
"MidWest" 2004-09-27 11:09 2.8672 6.6104 2004-09-27 16:37 "equipment fault"
"SouthEast" 2004-09-05 17:48 0.73387 3.6073 2004-09-05 20:46 "equipment fault"
"West" 2004-05-21 21:45 1.5999 NaN 2004-05-22 04:23 "equipment fault"
"SouthEast" 2002-09-01 18:22 0.95917 3.6759 2002-09-01 19:12 "severe storm"
"SouthEast" 2003-09-27 07:32 NaN 35.517 2003-10-04 07:02 "severe storm"
"West" 2003-11-12 06:12 2.5409 92.429 2003-11-17 02:04 "winter storm"
"NorthEast" 2004-09-18 05:54 0 0 NaT "equipment fault"
⋮
为行分配值
要将一行值分配给一个表,可以使用单行表或元胞数组。在这种情况下,使用元胞数组可能比创建单行表并赋值更方便。
例如,将数据分配给 outages
末尾的一个新行。显示表的末尾。
outages(end+1,:) = {"East",datetime("now"),17.3,325,datetime("tomorrow"),"unknown"}; outages(end-2:end,:)
ans=3×6 table
Region OutageTime Loss Customers RestorationTime Cause
___________ ________________ ________ _________ ________________ _________________
"SouthEast" 2013-12-20 19:52 0.023096 0.10382 2013-12-20 23:29 "thunder storm"
"SouthEast" 2011-09-14 11:55 0.45042 1.1835 2011-09-14 13:28 "equipment fault"
"East" 2024-03-07 17:24 17.3 325 2024-03-08 00:00 "unknown"
要将数据赋给多个行,请从另一个具有相同变量名称和数据类型的表向其赋值。例如,创建一个新的两行表。
newOutages = table(["West";"North"], ... datetime(2024,1,1:2)', ... [3;4], ... [300;400], ... datetime(2024,1,3:4)',["unknown";"unknown"], ... VariableNames=outages.Properties.VariableNames)
newOutages=2×6 table
Region OutageTime Loss Customers RestorationTime Cause
_______ ___________ ____ _________ _______________ _________
"West" 01-Jan-2024 3 300 03-Jan-2024 "unknown"
"North" 02-Jan-2024 4 400 04-Jan-2024 "unknown"
将该两行表分配给 outages
的前两行。然后显示 outages
的前四行。
outages(1:2,:) = newOutages; outages(1:4,:)
ans=4×6 table
Region OutageTime Loss Customers RestorationTime Cause
___________ ________________ ______ _________ ________________ _________________
"West" 2024-01-01 00:00 3 300 2024-01-03 00:00 "unknown"
"North" 2024-01-02 00:00 4 400 2024-01-04 00:00 "unknown"
"SouthEast" 2003-02-07 21:15 2.894 14.294 2003-02-17 08:14 "winter storm"
"West" 2004-04-06 05:44 4.3481 34.037 2004-04-06 06:10 "equipment fault"
为元素赋值
要为表的元素赋值,请使用花括号。例如,为前两次停电指定原因。
outages{1,"Cause"} = "severe storm"; outages{2,"Cause"} = "attack"; outages(1:4,:)
ans=4×6 table
Region OutageTime Loss Customers RestorationTime Cause
___________ ________________ ______ _________ ________________ _________________
"West" 2024-01-01 00:00 3 300 2024-01-03 00:00 "severe storm"
"North" 2024-01-02 00:00 4 400 2024-01-04 00:00 "attack"
"SouthEast" 2003-02-07 21:15 2.894 14.294 2003-02-17 08:14 "winter storm"
"West" 2004-04-06 05:44 4.3481 34.037 2004-04-06 06:10 "equipment fault"
查找值满足条件的表行
要查找其中的值满足条件的表行,请使用逻辑索引。指定包含感兴趣值的表变量,并根据表变量中的值是否满足您指定的条件来创建一个行索引数组。使用行索引对表进行索引。
首先,将停电数据从电子表格导入表中。
outages = readtable("outages.csv",TextType="string")
outages=1468×6 table
Region OutageTime Loss Customers RestorationTime Cause
___________ ________________ ______ __________ ________________ _________________
"SouthWest" 2002-02-01 12:18 458.98 1.8202e+06 2002-02-07 16:50 "winter storm"
"SouthEast" 2003-01-23 00:49 530.14 2.1204e+05 NaT "winter storm"
"SouthEast" 2003-02-07 21:15 289.4 1.4294e+05 2003-02-17 08:14 "winter storm"
"West" 2004-04-06 05:44 434.81 3.4037e+05 2004-04-06 06:10 "equipment fault"
"MidWest" 2002-03-16 06:18 186.44 2.1275e+05 2002-03-18 23:23 "severe storm"
"West" 2003-06-18 02:49 0 0 2003-06-18 10:54 "attack"
"West" 2004-06-20 14:39 231.29 NaN 2004-06-20 19:16 "equipment fault"
"West" 2002-06-06 19:28 311.86 NaN 2002-06-07 00:51 "equipment fault"
"NorthEast" 2003-07-16 16:23 239.93 49434 2003-07-17 01:12 "fire"
"MidWest" 2004-09-27 11:09 286.72 66104 2004-09-27 16:37 "equipment fault"
"SouthEast" 2004-09-05 17:48 73.387 36073 2004-09-05 20:46 "equipment fault"
"West" 2004-05-21 21:45 159.99 NaN 2004-05-22 04:23 "equipment fault"
"SouthEast" 2002-09-01 18:22 95.917 36759 2002-09-01 19:12 "severe storm"
"SouthEast" 2003-09-27 07:32 NaN 3.5517e+05 2003-10-04 07:02 "severe storm"
"West" 2003-11-12 06:12 254.09 9.2429e+05 2003-11-17 02:04 "winter storm"
"NorthEast" 2004-09-18 05:54 0 0 NaT "equipment fault"
⋮
接下来,创建与变量满足条件的行匹配的行索引。例如,对地区为 West
的行创建索引。
rows = matches(outages.Region,"West")
rows = 1468x1 logical array
0
0
0
1
0
1
1
1
0
0
⋮
您可以用逻辑索引对表进行索引。显示表中发生在 West
地区的停电的行。
outages(rows,:)
ans=354×6 table
Region OutageTime Loss Customers RestorationTime Cause
______ ________________ ______ __________ ________________ _________________
"West" 2004-04-06 05:44 434.81 3.4037e+05 2004-04-06 06:10 "equipment fault"
"West" 2003-06-18 02:49 0 0 2003-06-18 10:54 "attack"
"West" 2004-06-20 14:39 231.29 NaN 2004-06-20 19:16 "equipment fault"
"West" 2002-06-06 19:28 311.86 NaN 2002-06-07 00:51 "equipment fault"
"West" 2004-05-21 21:45 159.99 NaN 2004-05-22 04:23 "equipment fault"
"West" 2003-11-12 06:12 254.09 9.2429e+05 2003-11-17 02:04 "winter storm"
"West" 2004-12-21 18:50 112.05 7.985e+05 2004-12-29 03:46 "winter storm"
"West" 2002-12-16 13:43 70.752 4.8193e+05 2002-12-19 09:38 "winter storm"
"West" 2005-06-29 08:37 601.13 32005 2005-06-29 08:57 "equipment fault"
"West" 2003-04-14 07:11 276.41 1.5647 2003-04-14 08:52 "equipment fault"
"West" 2003-10-21 17:25 235.12 51496 2003-10-21 19:43 "equipment fault"
"West" 2005-10-21 08:33 NaN 52639 2005-11-22 22:10 "fire"
"West" 2003-08-28 23:46 172.01 1.6964e+05 2003-09-03 02:10 "wind"
"West" 2005-03-01 14:39 115.47 82611 2005-03-03 05:58 "equipment fault"
"West" 2005-09-26 06:32 258.18 1.3996e+05 2005-09-26 06:33 "earthquake"
"West" 2003-12-22 03:40 232.26 3.9462e+05 2003-12-24 16:32 "winter storm"
⋮
您可以用一个逻辑表达式匹配多个条件。例如,在 West
或 MidWest
地区中查找停电影响超出一百万客户的行。
rows = (outages.Customers > 1e6 & (matches(outages.Region,"West") | matches(outages.Region,"MidWest"))); outages(rows,:)
ans=10×6 table
Region OutageTime Loss Customers RestorationTime Cause
_________ ________________ ______ __________ ________________ _________________
"MidWest" 2002-12-10 10:45 14493 3.0879e+06 2002-12-11 18:06 "unknown"
"West" 2007-10-20 20:56 3537.5 1.3637e+06 2007-10-20 22:08 "equipment fault"
"West" 2006-12-28 14:04 804.05 1.5486e+06 2007-01-04 14:26 "severe storm"
"MidWest" 2006-07-16 00:05 1817.9 3.295e+06 2006-07-27 14:42 "severe storm"
"West" 2006-01-01 11:54 734.11 4.26e+06 2006-01-11 01:21 "winter storm"
"MidWest" 2008-09-19 23:31 4801.1 1.2151e+06 2008-10-03 14:04 "severe storm"
"MidWest" 2008-09-07 23:35 NaN 3.972e+06 2008-09-19 17:19 "severe storm"
"West" 2011-07-24 02:54 483.37 1.1212e+06 2011-07-24 12:18 "wind"
"West" 2010-01-24 18:47 348.91 1.8865e+06 2010-01-30 01:43 "severe storm"
"West" 2010-05-17 09:10 8496.6 2.0768e+06 2010-05-18 22:43 "equipment fault"
表索引语法一览
下表列出了每种索引类型与表索引语法的不同组合及结果输出。您可以按位置、名称或数据类型指定行和变量。
不支持线性索引。当使用花括号或圆括号进行索引时,必须同时指定行和变量。
变量名称和行名称可以包含任何字符,包括空格和非 ASCII 字符。此外,它们可以由任何字符(而不仅仅是字母)开头。变量名称和行名称可以不是有效的 MATLAB 标识符(由
isvarname
函数决定)。 (自 R2019b 起)当您按名称指定行和变量时,可以使用
pattern
对象来指定名称。例如,"Var" + digitsPattern
匹配以Var
开头并以任意个数字结尾的所有名称。 (自 R2022a 起)
输出 | 语法 | 行 | 变量 | 示例 |
---|---|---|---|---|
数组,包含从一个变量中提取的数据 |
| 未指定 | 指定为:
|
|
数组,包含从一个变量中提取的指定数据元素 |
| 未指定 索引 | 指定为:
| 使用数值索引或逻辑索引指定数组元素。 如果提取的数组是矩阵或多维数组,您可以指定多个数值索引。
|
数组,数据由指定的行和变量串联而成 |
| 指定为:
| 指定为:
|
|
数组,数据由指定的行和具有指定数据类型的变量串联而成 |
| 指定为:
| 指定为数据类型下标,如 |
|
数组,数据由所有行和变量串联而成 |
| 未指定 | 未指定 |
|
表,包含指定的行和变量 |
| 指定为:
| 指定为:
|
|
表,包含具有指定数据类型的指定行和变量 |
| 指定为:
| 指定为数据类型下标,如 |
|
另请参阅
table
| readtable
| vartype
| matches