Main Content

创建表并为其分配数据

表适用于列向数据,如文本文件或电子表格中的表格数据。表将数据列存储在变量中。表中的变量可以有不同数据类型,但所有变量必须有相同的行数。此外,表变量不仅限于存储列向量。例如,表变量可以包含具有多列的矩阵,只要它的行数与其他表变量相同即可。

在 MATLAB® 中,您可以通过几种方式创建表并为其分配数据。

  • 使用 table 函数从输入数组创建表。

  • 使用圆点表示法将变量添加到现有表中。

  • 将变量分配给空表。

  • 预分配表,稍后填写其数据。

  • 使用 array2tablecell2tablestruct2table 函数将变量转换为表。

  • 使用 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.Weightpatients.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

接下来,通过对变量赋值来创建患者数据的副本。表变量名称不必与数组名称匹配,如 NameBP 表变量所示。

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         25-Jan-2024 22:12:34    "S1"     
        68         26-Jan-2024 22:12:34    "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         25-Jan-2024 22:12:34     "S1"  
        68         26-Jan-2024 22:12:34     "S2"  
        63         27-Jan-2024 22:12:34     "S3"  
        72         28-Jan-2024 22:12:34     "S4"  

您可以使用这两种语法中的任何一种,通过在表的末尾对行进行赋值来增大表的大小。如有必要,会使用默认值填充缺失行。

temps(6,:) = {62,datetime('now')+6,"S6"}
temps=6×3 table
    Temperature            Time             Station 
    ___________    ____________________    _________

        75         25-Jan-2024 22:12:34    "S1"     
        68         26-Jan-2024 22:12:34    "S2"     
        63         27-Jan-2024 22:12:34    "S3"     
        72         28-Jan-2024 22:12:34    "S4"     
         0                          NaT    <missing>
        62         31-Jan-2024 22:12:34    "S6"     

将变量转换为表

您可以将具有不同数据类型的变量转换为表。元胞数组和结构体是其他形式的容器,可以存储具有不同数据类型的数组。因此,您可以将元胞数组和结构体转换为表。您也可以将数组转换为表,表中的每个变量对应数组中的一个值列。要转换这些类型的变量,请使用 array2tablecell2tablestruct2table 函数。

例如,使用 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。它将数值、日期时间以及字符串读入具有适当数据类型的表变量。此处,LossCustomers 是数值数组。OutageTimeRestorationTime 变量是 datetime 数组,因为 readtable 识别出了输入文件的这些列中文本的日期时间格式。要将其余文本数据读入字符串数组,请指定 "TextType" 名称-值参量。

outages = readtable("outages.csv","TextType","string")
outages=1468×6 table
      Region            OutageTime          Loss     Customers       RestorationTime             Cause      
    ___________    ____________________    ______    __________    ____________________    _________________

    "SouthWest"    01-Feb-2002 12:18:00    458.98    1.8202e+06    07-Feb-2002 16:50:00    "winter storm"   
    "SouthEast"    23-Jan-2003 00:49:00    530.14    2.1204e+05                     NaT    "winter storm"   
    "SouthEast"    07-Feb-2003 21:15:00     289.4    1.4294e+05    17-Feb-2003 08:14:00    "winter storm"   
    "West"         06-Apr-2004 05:44:00    434.81    3.4037e+05    06-Apr-2004 06:10:00    "equipment fault"
    "MidWest"      16-Mar-2002 06:18:00    186.44    2.1275e+05    18-Mar-2002 23:23:00    "severe storm"   
    "West"         18-Jun-2003 02:49:00         0             0    18-Jun-2003 10:54:00    "attack"         
    "West"         20-Jun-2004 14:39:00    231.29           NaN    20-Jun-2004 19:16:00    "equipment fault"
    "West"         06-Jun-2002 19:28:00    311.86           NaN    07-Jun-2002 00:51:00    "equipment fault"
    "NorthEast"    16-Jul-2003 16:23:00    239.93         49434    17-Jul-2003 01:12:00    "fire"           
    "MidWest"      27-Sep-2004 11:09:00    286.72         66104    27-Sep-2004 16:37:00    "equipment fault"
    "SouthEast"    05-Sep-2004 17:48:00    73.387         36073    05-Sep-2004 20:46:00    "equipment fault"
    "West"         21-May-2004 21:45:00    159.99           NaN    22-May-2004 04:23:00    "equipment fault"
    "SouthEast"    01-Sep-2002 18:22:00    95.917         36759    01-Sep-2002 19:12:00    "severe storm"   
    "SouthEast"    27-Sep-2003 07:32:00       NaN    3.5517e+05    04-Oct-2003 07:02:00    "severe storm"   
    "West"         12-Nov-2003 06:12:00    254.09    9.2429e+05    17-Nov-2003 02:04:00    "winter storm"   
    "NorthEast"    18-Sep-2004 05:54:00         0             0                     NaT    "equipment fault"
      ⋮

使用导入工具导入表

最后,您可以使用导入工具以交互方式预览和导入电子表格或带分隔符的文本文件中的数据。打开导入工具有两种方法。

  • MATLAB 工具条:在主页选项卡中的变量部分中,点击导入数据

  • MATLAB 命令提示符:输入 uiimport(filename),其中 filename 是文本文件或电子表格文件的名称。

例如,通过使用 uiimportwhich 获取文件路径来打开 outages.csv 示例文件。

uiimport(which("outages.csv"))

导入工具向您显示 outages.csv 中六列的预览。要将数据作为表导入,请按照以下步骤操作。

  1. 导入的数据部分中,选择作为输出类型。

  2. 点击导入所选内容(右上角附近)。名为 outages 的新表将出现在您的工作区中。

importToolOutages.png

另请参阅

函数

App

相关主题