Main Content

本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

创建和使用表

以下示例说明如何根据工作区变量创建表,使用表数据,并将表写入文件以供日后使用。table 是一个数据类型,可将异构数据和元数据属性(例如变量名称、行名称、说明和变量单位)收集到一个容器中。

表适用于列向数据或表格数据,这些数据通常以列形式存储于文本文件或电子表格中。表中的每个变量可以具有不同的数据类型,但必须具有相同的行数。不过,表中的变量并不限于列向量。例如,表变量可以包含具有多列的矩阵,只要它的行数与其他表变量相同即可。表的典型用途是存储试验数据,使用行表示不同的观测值,使用列表示不同的测量变量。

表是用于收集和整理相关数据变量以及查看和汇总数据的便捷容器。例如,您可以提取变量以执行计算并方便地将相应结果添加为新的表变量。完成计算时,将该表写入文件以保存结果。

创建并查看表

根据工作区变量创建一个表并查看它。或者,使用 导入工具readtable 功能根据电子表格或文本文件创建表。使用这些函数从文件导入数据时,每个列都会变为表变量。

将 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               

使用包含患者数据的列向变量填充表。您可以按名称访问和分配表变量。当您从工作区变量分配表变量时,您可以为表变量指定不同名称。

创建一个表并使用 GenderSmokerHeightWeight 工作区变量填充它。显示前五行。

T = table(Gender,Smoker,Height,Weight);
T(1:5,:)
ans=5×4 table
      Gender      Smoker    Height    Weight
    __________    ______    ______    ______

    {'Male'  }    true        71       176  
    {'Male'  }    false       69       163  
    {'Female'}    false       64       131  
    {'Female'}    false       67       133  
    {'Female'}    false       64       119  

作为备选方法,可以使用 readtable 函数从逗号分隔文件中读取患者数据。readtable 会读取文件中的所有列。

通过读取文件 patients.dat 中的所有列来创建一个表。

T2 = readtable('patients.dat');
T2(1:5,:)
ans=5×10 table
      LastName        Gender      Age              Location               Height    Weight    Smoker    Systolic    Diastolic    SelfAssessedHealthStatus
    ____________    __________    ___    _____________________________    ______    ______    ______    ________    _________    ________________________

    {'Smith'   }    {'Male'  }    38     {'County General Hospital'  }      71       176        1         124          93             {'Excellent'}      
    {'Johnson' }    {'Male'  }    43     {'VA Hospital'              }      69       163        0         109          77             {'Fair'     }      
    {'Williams'}    {'Female'}    38     {'St. Mary's Medical Center'}      64       131        0         125          83             {'Good'     }      
    {'Jones'   }    {'Female'}    40     {'VA Hospital'              }      67       133        0         117          75             {'Fair'     }      
    {'Brown'   }    {'Female'}    49     {'County General Hospital'  }      64       119        0         122          80             {'Good'     }      

您可以使用圆点表示法 T.varname 分配多个列向表变量,其中 T 是表,varname 是所需的变量名称。创建随机的数字标识符。然后,将其赋给一个表变量,并将该表变量命名为 ID。您分配到表中的所有变量必须具有相同的行数。显示 T 的前五行。

T.ID = randi(1e4,100,1);
T(1:5,:)
ans=5×5 table
      Gender      Smoker    Height    Weight     ID 
    __________    ______    ______    ______    ____

    {'Male'  }    true        71       176      8148
    {'Male'  }    false       69       163      9058
    {'Female'}    false       64       131      1270
    {'Female'}    false       67       133      9134
    {'Female'}    false       64       119      6324

您分配到表中的所有变量必须具有相同的行数。

使用 summary 函数创建汇总表来查看每个变量的数据类型、说明、单位和其他描述性统计量。

summary(T)
Variables:

    Gender: 100x1 cell array of character vectors

    Smoker: 100x1 logical

        Values:

            True        34   
            False       66   

    Height: 100x1 double

        Values:

            Min          60   
            Median       67   
            Max          72   

    Weight: 100x1 double

        Values:

            Min          111  
            Median     142.5  
            Max          202  

    ID: 100x1 double

        Values:

            Min           120 
            Median     5485.5 
            Max          9706 

返回表的大小。

size(T)
ans = 1×2

   100     5

T 包含 100 行和 5 个变量。

创建一个新的包含 T 中前五行的较小表并显示该表。您可以在括号中使用数值索引指定行和变量。此方法类似于通过索引数值数组来创建子数组的情况。Tnew 是一个 5×5 的表。

Tnew = T(1:5,:)
Tnew=5×5 table
      Gender      Smoker    Height    Weight     ID 
    __________    ______    ______    ______    ____

    {'Male'  }    true        71       176      8148
    {'Male'  }    false       69       163      9058
    {'Female'}    false       64       131      1270
    {'Female'}    false       67       133      9134
    {'Female'}    false       64       119      6324

创建一个包含 Tnew 中所有行以及第二至最后行中的变量的较小表。使用 end 关键字指示表的最后一个变量或最后一行。Tnew 是一个 5×4 的表。

Tnew = Tnew(:,2:end)
Tnew=5×4 table
    Smoker    Height    Weight     ID 
    ______    ______    ______    ____

    true        71       176      8148
    false       69       163      9058
    false       64       131      1270
    false       67       133      9134
    false       64       119      6324

按行和变量名称访问数据

使用行和变量名称而非数值索引向 T 中添加行名称并对表进行索引。通过将 LastName 工作区变量赋给 TRowNames 属性来添加行名称。

T.Properties.RowNames = LastName;

显示 T 的前五行以及行名称。

T(1:5,:)
ans=5×5 table
                  Gender      Smoker    Height    Weight     ID 
                __________    ______    ______    ______    ____

    Smith       {'Male'  }    true        71       176      8148
    Johnson     {'Male'  }    false       69       163      9058
    Williams    {'Female'}    false       64       131      1270
    Jones       {'Female'}    false       67       133      9134
    Brown       {'Female'}    false       64       119      6324

返回 T 的大小。此大小不会更改,因为在计算表大小时不会包括行和变量名称。

size(T)
ans = 1×2

   100     5

选择姓氏为 'Smith''Johnson' 的患者的所有数据。在本例中,使用行名称比使用数值索引更为简单。Tnew 是一个 2×5 的表。

Tnew = T({'Smith','Johnson'},:)
Tnew=2×5 table
                Gender     Smoker    Height    Weight     ID 
               ________    ______    ______    ______    ____

    Smith      {'Male'}    true        71       176      8148
    Johnson    {'Male'}    false       69       163      9058

通过变量名称索引来选择名为 'Johnson' 的患者的身高和体重。Tnew 是一个 1×2 的表。

Tnew = T('Johnson',{'Height','Weight'})
Tnew=1×2 table
               Height    Weight
               ______    ______

    Johnson      69       163  

您可以使用圆点语法访问表变量(如 T.Height 中所示),也可以按命名索引访问表变量(如 T(:,'Height') 中所示)。

计算结果并将其添加为表变量

您可以访问表变量的内容,然后使用 MATLAB® 函数对它们执行计算。根据现有表变量中的数据计算体质指数 (BMI),并将其添加为新变量。绘制 BMI 与患者状态为烟民或非烟民的关系图。向表中添加血压读数,并绘制血压与 BMI 的关系图。

使用表变量 WeightHeight 计算 BMI。您可以提取 WeightHeight 以进行计算,同时在包含其余患者数据的表中方便地保留 WeightHeightBMI。显示 T 的前五行。

T.BMI = (T.Weight*0.453592)./(T.Height*0.0254).^2;

T(1:5,:)
ans=5×6 table
                  Gender      Smoker    Height    Weight     ID      BMI  
                __________    ______    ______    ______    ____    ______

    Smith       {'Male'  }    true        71       176      8148    24.547
    Johnson     {'Male'  }    false       69       163      9058    24.071
    Williams    {'Female'}    false       64       131      1270    22.486
    Jones       {'Female'}    false       67       133      9134    20.831
    Brown       {'Female'}    false       64       119      6324    20.426

填充 BMI 的变量单位和变量说明属性。您可以将元数据添加到任何表变量中,以进一步描述该变量中包含的数据。

T.Properties.VariableUnits{'BMI'} = 'kg/m^2';
T.Properties.VariableDescriptions{'BMI'} = 'Body Mass Index';

创建一个直方图以探索这组患者的吸烟与体质指数之间是否存在关系。您可以使用 Smoker 表变量中的逻辑值来索引 BMI,这是因为每行都包含同一患者的 BMISmoker 值。

tf = (T.Smoker == false);
h1 = histogram(T.BMI(tf),'BinMethod','integers');
hold on
tf = (T.Smoker == true);
h2 = histogram(T.BMI(tf),'BinMethod','integers');
xlabel('BMI (kg/m^2)');
ylabel('Number of Patients');
legend('Nonsmokers','Smokers');
title('BMI Distributions for Smokers and Nonsmokers');
hold off

从工作区变量 SystolicDiastolic 中添加患者的血压读数。每一行都包含同一患者的 SystolicDiastolicBMI 值。

T.Systolic = Systolic;
T.Diastolic = Diastolic;

创建一个直方图来显示 DiastolicBMI 的较高值之间是否存在关系。

tf = (T.BMI <= 25);
h1 = histogram(T.Diastolic(tf),'BinMethod','integers');
hold on
tf = (T.BMI > 25);
h2 = histogram(T.Diastolic(tf),'BinMethod','integers');
xlabel('Diastolic Reading (mm Hg)');
ylabel('Number of Patients');
legend('BMI <= 25','BMI > 25');
title('Diastolic Readings for Low and High BMI');
hold off

对表变量和输出行进行重新排序

要准备表进行输出,请按名称重新排列该表行的顺序,并按位置或名称重新排列表变量。显示表的最终排列。

按行名称对表进行排序,以使患者按字母顺序列出。

T = sortrows(T,'RowNames');

T(1:5,:)
ans=5×8 table
                   Gender      Smoker    Height    Weight     ID      BMI      Systolic    Diastolic
                 __________    ______    ______    ______    ____    ______    ________    _________

    Adams        {'Female'}    false       66       137      8235    22.112      127          83    
    Alexander    {'Male'  }    true        69       171      1300    25.252      128          99    
    Allen        {'Female'}    false       63       143      7432    25.331      113          80    
    Anderson     {'Female'}    false       68       128      1577    19.462      114          77    
    Bailey       {'Female'}    false       68       130      2239    19.766      113          81    

创建一个 BloodPressure 变量,将血压读数保存在一个 100×2 的表变量中。

T.BloodPressure = [T.Systolic T.Diastolic];

从表中删除 SystolicDiastolic,因为它们是冗余的。

T.Systolic = [];
T.Diastolic = [];

T(1:5,:)
ans=5×7 table
                   Gender      Smoker    Height    Weight     ID      BMI      BloodPressure
                 __________    ______    ______    ______    ____    ______    _____________

    Adams        {'Female'}    false       66       137      8235    22.112     127     83  
    Alexander    {'Male'  }    true        69       171      1300    25.252     128     99  
    Allen        {'Female'}    false       63       143      7432    25.331     113     80  
    Anderson     {'Female'}    false       68       128      1577    19.462     114     77  
    Bailey       {'Female'}    false       68       130      2239    19.766     113     81  

要将 ID 作为第一列,请按位置重新排列表变量。

T = T(:,[5 1:4 6 7]);

T(1:5,:)
ans=5×7 table
                  ID       Gender      Smoker    Height    Weight     BMI      BloodPressure
                 ____    __________    ______    ______    ______    ______    _____________

    Adams        8235    {'Female'}    false       66       137      22.112     127     83  
    Alexander    1300    {'Male'  }    true        69       171      25.252     128     99  
    Allen        7432    {'Female'}    false       63       143      25.331     113     80  
    Anderson     1577    {'Female'}    false       68       128      19.462     114     77  
    Bailey       2239    {'Female'}    false       68       130      19.766     113     81  

您还可以按名称对表变量进行重新排序。要重新排列表变量以使 Gender 成为最后一个变量,请执行以下操作:

  1. 在该表的 VariableNames 属性中查找 'Gender'

  2. 'Gender' 移到变量名称元胞数组末尾。

  3. 使用名称元胞数组重新排列表变量的顺序。

varnames = T.Properties.VariableNames;
others = ~strcmp('Gender',varnames);
varnames = [varnames(others) 'Gender'];
T = T(:,varnames);

显示经过重新排序的表的前五行。

T(1:5,:)
ans=5×7 table
                  ID     Smoker    Height    Weight     BMI      BloodPressure      Gender  
                 ____    ______    ______    ______    ______    _____________    __________

    Adams        8235    false       66       137      22.112     127     83      {'Female'}
    Alexander    1300    true        69       171      25.252     128     99      {'Male'  }
    Allen        7432    false       63       143      25.331     113     80      {'Female'}
    Anderson     1577    false       68       128      19.462     114     77      {'Female'}
    Bailey       2239    false       68       130      19.766     113     81      {'Female'}

将表写入文件

您可以将整个表写入文件,或创建一个子表来将原始表的选定部分写入一个单独的文件。

使用 writetable 函数将 T 写入文件。

writetable(T,'allPatientsBMI.txt');

您可以使用 readtable 函数将 allPatientsBMI.txt 中的数据读入新表中。

创建一个子表并将其写入一个单独的文件中。删除包含烟民患者数据的行。然后删除 Smoker 变量。nonsmokers 仅包含非烟民患者的数据。

nonsmokers = T;
toDelete = (nonsmokers.Smoker == true);
nonsmokers(toDelete,:) = [];
nonsmokers.Smoker = [];

nonsmokers 写入文件。

writetable(nonsmokers,'nonsmokersBMI.txt');

另请参阅

| | | | | | | |

相关示例

详细信息