创建表并为其分配数据
表适用于列向数据,如文本文件或电子表格中的表格数据。表将数据列存储在变量中。表中的变量可以有不同数据类型,但所有变量必须有相同的行数。此外,表变量不仅限于存储列向量。例如,表变量可以包含具有多列的矩阵,只要它的行数与其他表变量相同即可。
在 MATLAB® 中,您可以通过几种方式创建表并为其分配数据。
使用
table
函数从输入数组创建表。使用圆点表示法将变量添加到现有表中。
将变量分配给空表。
预分配表,稍后填写其数据。
使用
array2table
、cell2table
或struct2table
函数将变量转换为表。使用
readtable
函数从文件中读取表。使用导入工具导入表。
您选择的方式取决于数据的性质以及您计划如何在代码中使用表。
从输入数组创建表
您可以使用 table
函数从数组创建表。例如,创建一个包含五名患者数据的小表。
首先,创建六个列向数据数组。这些数组包含五行,因为有五个患者。(这些数组大部分是 5×1 列向量,而 BloodPressure
是 5×2 矩阵。)
LastName = ["Sanchez";"Johnson";"Zhang";"Diaz";"Brown"]; Age = [38;43;38;40;49]; Smoker = [true;false;true;false;true]; Height = [71;69;64;67;64]; Weight = [176;163;131;133;119]; BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80];
现在创建一个表 patients
作为数据的容器。在对 table
函数的这一调用中,输入参数使用工作区变量名称作为 patients
中变量的名称。
patients = table(LastName,Age,Smoker,Height,Weight,BloodPressure)
patients=5×6 table
LastName Age Smoker Height Weight BloodPressure
_________ ___ ______ ______ ______ _____________
"Sanchez" 38 true 71 176 124 93
"Johnson" 43 false 69 163 109 77
"Zhang" 38 true 64 131 125 83
"Diaz" 40 false 67 133 117 75
"Brown" 49 true 64 119 122 80
该表是一个 5×6 的表,因为它有六个变量。正如 BloodPressure
变量所示,一个表变量本身可以有多个列。此示例说明为什么表具有行和变量,而不是行和列。
使用圆点表示法将变量添加到表中
创建表后,您可以随时使用圆点表示法添加新变量。圆点表示法按名称引用表变量,即 T.varname
,其中 T
是表,varname
是变量名称。这种表示法类似于您用于访问数据并将数据分配给结构体字段的表示法。
例如,将一个 BMI
变量添加到 patients
。先使用 patients.Weight
和 patients.Height
中的值计算体重指数,即 BMI。再将 BMI 值分配给一个新的表变量。
patients.BMI = (patients.Weight*0.453592)./(patients.Height*0.0254).^2
patients=5×7 table
LastName Age Smoker Height Weight BloodPressure BMI
_________ ___ ______ ______ ______ _____________ ______
"Sanchez" 38 true 71 176 124 93 24.547
"Johnson" 43 false 69 163 109 77 24.071
"Zhang" 38 true 64 131 125 83 22.486
"Diaz" 40 false 67 133 117 75 20.831
"Brown" 49 true 64 119 122 80 20.426
将变量分配给空表
创建表的另一种方法是从空表开始,并为其分配变量。例如,重新创建患者数据的表,但这次使用圆点表示法分配变量。
首先,通过不带参数调用 table
创建一个空表 patients2
。
patients2 = table
patients2 = 0x0 empty table
接下来,通过对变量赋值来创建患者数据的副本。表变量名称不必与数组名称匹配,如 Name
和 BP
表变量所示。
patients2.Name = LastName; patients2.Age = Age; patients2.Smoker = Smoker; patients2.Height = Height; patients2.Weight = Weight; patients2.BP = BloodPressure
patients2=5×6 table
Name Age Smoker Height Weight BP
_________ ___ ______ ______ ______ __________
"Sanchez" 38 true 71 176 124 93
"Johnson" 43 false 69 163 109 77
"Zhang" 38 true 64 131 125 83
"Diaz" 40 false 67 133 117 75
"Brown" 49 true 64 119 122 80
预分配表和填充行
有时,您知道要存储在表中的数据的大小和数据类型,但您计划稍后对数据赋值。也许您计划一次只添加几行。这种情况下,可以先在表中预分配空间,然后再为空行赋值,这样效率会更高。
例如,要为预计包含不同气象站的时间和温度读数的表预分配空间,请使用 table
函数。指定表变量的大小和数据类型,而不是提供输入数组。要为它们提供名称,请指定 'VariableNames'
参数。预分配会用适合其数据类型的默认值填充表变量。
sz = [4 3]; varTypes = ["double","datetime","string"]; varNames = ["Temperature","Time","Station"]; temps = table('Size',sz,'VariableTypes',varTypes,'VariableNames',varNames)
temps=4×3 table
Temperature Time Station
___________ ____ _________
0 NaT <missing>
0 NaT <missing>
0 NaT <missing>
0 NaT <missing>
向表中分配或添加行的一种方法是将元胞数组赋给行。如果元胞数组是行向量,并且其元素与其各自变量的数据类型匹配,则赋值会将元胞数组转换为表行。但是,使用元胞数组一次只能对一行进行赋值。为前两行赋值。
temps(1,:) = {75,datetime('now'),"S1"}; temps(2,:) = {68,datetime('now')+1,"S2"}
temps=4×3 table
Temperature Time Station
___________ ____________________ _________
75 30-Jan-2023 14:40:17 "S1"
68 31-Jan-2023 14:40:17 "S2"
0 NaT <missing>
0 NaT <missing>
您也可以将一个较小的表中的行赋到另一个大一些的表中。使用此方法,您可以一次对一行或多行赋值。
temps(3:4,:) = table([63;72],[datetime('now')+2;datetime('now')+3],["S3";"S4"])
temps=4×3 table
Temperature Time Station
___________ ____________________ _______
75 30-Jan-2023 14:40:17 "S1"
68 31-Jan-2023 14:40:17 "S2"
63 01-Feb-2023 14:40:17 "S3"
72 02-Feb-2023 14:40:17 "S4"
您可以使用这两种语法中的任何一种,通过在表的末尾对行进行赋值来增大表的大小。如有必要,会使用默认值填充缺失行。
temps(6,:) = {62,datetime('now')+6,"S6"}
temps=6×3 table
Temperature Time Station
___________ ____________________ _________
75 30-Jan-2023 14:40:17 "S1"
68 31-Jan-2023 14:40:17 "S2"
63 01-Feb-2023 14:40:17 "S3"
72 02-Feb-2023 14:40:17 "S4"
0 NaT <missing>
62 05-Feb-2023 14:40:17 "S6"
将变量转换为表
您可以将具有不同数据类型的变量转换为表。元胞数组和结构体是其他形式的容器,可以存储具有不同数据类型的数组。因此,您可以将元胞数组和结构体转换为表。您也可以将数组转换为表,表中的每个变量对应数组中的一个值列。要转换这些类型的变量,请使用 array2table
、cell2table
或 struct2table
函数。
例如,使用 array2table
将数组转换为表。数组没有列名称,因此该表将应用默认的变量名称。
A = randi(3,3)
A = 3×3
3 3 1
3 2 2
1 1 3
a2t = array2table(A)
a2t=3×3 table
A1 A2 A3
__ __ __
3 3 1
3 2 2
1 1 3
您可以使用 "VariableNames"
名称-值参数提供自己的表变量名称。
a2t = array2table(A,"VariableNames",["First","Second","Third"])
a2t=3×3 table
First Second Third
_____ ______ _____
3 3 1
3 2 2
1 1 3
从文件读取表
在 CSV(逗号分隔值)文件或 Excel® 电子表格等文件中包含大量表格数据是很常见的。要将此类数据读入表中,请使用 readtable
函数。
例如,CSV 文件 outages.csv
是 MATLAB 附带的示例文件。该文件包含一组停电数据。outages.csv
的第一行为列名称。文件的其余部分包含每次停电的数据值(以逗号分隔)。此处显示了前几行。
Region,OutageTime,Loss,Customers,RestorationTime,Cause SouthWest,2002-02-01 12:18,458.9772218,1820159.482,2002-02-07 16:50,winter storm SouthEast,2003-01-23 00:49,530.1399497,212035.3001,,winter storm SouthEast,2003-02-07 21:15,289.4035493,142938.6282,2003-02-17 08:14,winter storm West,2004-04-06 05:44,434.8053524,340371.0338,2004-04-06 06:10,equipment fault MidWest,2002-03-16 06:18,186.4367788,212754.055,2002-03-18 23:23,severe storm ...
要读取 outages.csv
并将数据存储在表中,可以使用 readtable
。它将数值、日期时间以及字符串读入具有适当数据类型的表变量。此处,Loss
和 Customers
是数值数组。OutageTime
和 RestorationTime
变量是 datetime
数组,因为 readtable
识别出了输入文件的这些列中文本的日期时间格式。要将其余文本数据读入字符串数组,请指定 "TextType"
名称-值参数。
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"
⋮
使用导入工具导入表
最后,您可以使用导入工具以交互方式预览和导入电子表格或带分隔符的文本文件中的数据。打开导入工具有两种方法。
MATLAB 工具条:在主页选项卡中的变量部分中,点击导入数据。
MATLAB 命令提示符:输入
uiimport(
filename
)
,其中filename
是文本文件或电子表格文件的名称。
例如,通过使用 uiimport
和 which
获取文件路径来打开 outages.csv
示例文件。
uiimport(which("outages.csv"))
导入工具向您显示 outages.csv
中六列的预览。要将数据作为表导入,请按照以下步骤操作。
在导入的数据部分中,选择表作为输出类型。
点击导入所选内容(右上角附近)。名为
outages
的新表将出现在您的工作区中。
另请参阅
readtable
| table
| array2table
| cell2table
| struct2table
| 导入工具