Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

使用表的好处

方便将混合类型的数据存储于单个容器中

您可以使用 table 数据类型来将混合类型的数据和元数据属性(例如变量名称、行名称、说明和变量单位)收集到单个容器中。表适用于列向数据或表格数据,这些数据通常以列形式存储于文本文件或电子表格中。例如,您可以使用表存储试验数据,使用行表示不同的观测对象,使用列表示不同的测量变量。

表由若干行向变量和若干列向变量组成。表中的每个变量可以具有不同的数据类型和不同的大小,但每个变量必须具有相同的行数。

例如,加载样本患者数据。

load patients

然后,将工作区变量 SystolicDiastolic 合并为单个 BloodPressure 变量,并将工作区变量 SelfAssessedHealthStatus 从字符向量元胞数组转换为 categorical 数组。

BloodPressure = [Systolic Diastolic];
SelfAssessedHealthStatus = categorical(SelfAssessedHealthStatus);

whos("Age","Smoker","BloodPressure","SelfAssessedHealthStatus")
  Name                            Size            Bytes  Class          Attributes

  Age                           100x1               800  double                   
  BloodPressure                 100x2              1600  double                   
  SelfAssessedHealthStatus      100x1               560  categorical              
  Smoker                        100x1               100  logical                  

变量 AgeBloodPressureSelfAssessedHealthStatusSmoker 具有不同的数据类型,是要存储于表中的候选对象,因为它们都具有相同的行数 100。

现在,从变量创建一个表并显示它。

T = table(Age,Smoker,BloodPressure,SelfAssessedHealthStatus)
T=100×4 table
    Age    Smoker    BloodPressure    SelfAssessedHealthStatus
    ___    ______    _____________    ________________________

    38     true       124     93             Excellent        
    43     false      109     77             Fair             
    38     false      125     83             Good             
    40     false      117     75             Fair             
    49     false      122     80             Good             
    46     false      121     70             Good             
    33     true       130     88             Good             
    40     false      115     82             Good             
    28     false      115     78             Excellent        
    31     false      118     86             Excellent        
    45     false      114     77             Excellent        
    42     false      115     68             Poor             
    25     false      127     74             Poor             
    39     true       130     95             Excellent        
    36     false      114     79             Good             
    48     true       130     92             Good             
      ⋮

该表以表格形式显示,并且变量名称位于顶部。

表中的每个变量都是一个单独的数据类型。如果向表中添加一个新行,MATLAB® 将强制使新数据与对应的表变量的数据类型保持一致。例如,如果您尝试添加新患者的信息,其中第一列包含患者的健康状况而不是年龄(如表达式 T(end+1,:) = {"Poor",true,[130 84],37} 中一样),则会出现错误:

Right hand side of an assignment to a categorical array must be a categorical or text representing a category name.

出现错误的原因是 MATLAB® 不能将数值数据 37 赋给分类数组 SelfAssessedHealthStatus

为了便于比较表和结构体,假设一个结构体数组 StructArray,它等效于表 T

StructArray = table2struct(T)
StructArray=100×1 struct array with fields:
    Age
    Smoker
    BloodPressure
    SelfAssessedHealthStatus

结构体数组使用命名字段组织记录。每个字段的值都具有不同的数据类型或大小。现在,显示 StructArray 的第一个元素的命名字段。

StructArray(1)
ans = struct with fields:
                         Age: 38
                      Smoker: 1
               BloodPressure: [124 93]
    SelfAssessedHealthStatus: Excellent

结构体数组中的字段与表中的变量相似。但是,与表不同的是,结构体数组不能在字段中强制实施同质化要求。例如,有些 S.SelfAssessedHealthStatus 值是分类数组元素,如 PoorGood,有些是字符串,如 "Poor""Good",还有一些是整数,如 01

现在假设在一个标量结构体中存储的相同数据,四个字段,每一个包含表中的一个变量。

ScalarStruct = struct(...
    "Age",Age,...
    "Smoker",Smoker,...
    "BloodPressure",BloodPressure,...
    "SelfAssessedHealthStatus",SelfAssessedHealthStatus)
ScalarStruct = struct with fields:
                         Age: [100x1 double]
                      Smoker: [100x1 logical]
               BloodPressure: [100x2 double]
    SelfAssessedHealthStatus: [100x1 categorical]

与表不同,您不能强制使这些数据保持矩形结构。例如,字段 ScalarStruct.Age 的长度可能不同于其他字段。

使用表可以保持矩形结构体(类似于结构体数组)并强制使变量保持同质(类似于标量结构体中的字段)。尽管元胞数组没有命名字段,但它们与结构体数组和标量结构体一样具有许多相同的不足之处。如果每个变量中的矩形数据是同质的,请考虑使用表。然后便可使用数值或命名索引,还可以使用表属性存储元数据。

使用数值索引或命名索引访问数据

您可以使用圆括号、花括号或点索引对表进行索引。使用括号可以选择表中的一个数据子集并保留表容器。使用花括号和点索引可以从表中提取数据。在每个表索引方法中,可以通过名称或数值索引指定要访问的行或变量。

考虑上述样本表。表 T 中的每一行表示一位不同的患者。工作区变量 LastName 包含这 100 行数据的唯一标识符。通过将 RowNames 属性设置为 LastName 来向表中添加行名称,并显示更新后的表的前五行。

T.Properties.RowNames = LastName;
T(1:5,:)
ans=5×4 table
                Age    Smoker    BloodPressure    SelfAssessedHealthStatus
                ___    ______    _____________    ________________________

    Smith       38     true       124     93             Excellent        
    Johnson     43     false      109     77             Fair             
    Williams    38     false      125     83             Good             
    Jones       40     false      117     75             Fair             
    Brown       49     false      122     80             Good             

除了为表添加标签,还可以使用行和变量名称访问表中的数据。例如,使用命名索引显示患者 WilliamsBrown 的年龄和血压。

T(["Williams","Brown"],["Age","BloodPressure"])
ans=2×2 table
                Age    BloodPressure
                ___    _____________

    Williams    38      125     83  
    Brown       49      122     80  

现在,使用数组索引返回一个等效的子表。从第一个和第三个变量中返回第三行和第五行。

T([3 5],[1 3])
ans=2×2 table
                Age    BloodPressure
                ___    _____________

    Williams    38      125     83  
    Brown       49      122     80  

使用元胞数组或结构体时,不能如此灵活地使用命名索引或数值索引。

  • 使用元胞数组时,必须使用 strcmp 查找所需的命名数据,然后才可以对数组进行索引。

  • 使用标量结构体或结构体数组时,不能按编号引用字段。此外,使用标量结构体时,不能很轻松地选择变量子集或观测值子集。使用结构体数组时,可以选择观测值子集,但不能选择变量子集。

  • 使用表时,可以根据命名索引或数值索引访问数据。此外,可以轻松地选择变量子集和行子集。

有关表索引的详细信息,请参阅访问表中的数据

使用表属性存储元数据

除了存储数据以外,表还具有可用来存储元数据的属性,例如变量名称、行名称、说明和变量单位。您可以使用 T.Properties.PropName 来访问属性,其中 T 是表的名称,PropName 是表属性的名称。

例如,为 Age 添加表说明、变量说明和变量单位。

T.Properties.Description = "Simulated Patient Data";

T.Properties.VariableDescriptions = ...
    ["" ...
     "true or false" ...
     "Systolic/Diastolic" ...
     "Status Reported by Patient"];

T.Properties.VariableUnits("Age") = "Yrs";

VariableDescriptions 内的单个空字符串表示对应的变量没有描述。有关详细信息,请参阅 table 的“属性”部分。

要打印表摘要,请使用 summary 函数。

summary(T)
Description:  Simulated Patient Data

Variables:

    Age: 100x1 double

        Properties:
            Units:  Yrs
        Values:

            Min          25   
            Median       39   
            Max          50   

    Smoker: 100x1 logical

        Properties:
            Description:  true or false
        Values:

            True        34   
            False       66   

    BloodPressure: 100x2 double

        Properties:
            Description:  Systolic/Diastolic
        Values:
                      Column 1    Column 2
                      ________    ________

            Min         109           68  
            Median      122         81.5  
            Max         138           99  

    SelfAssessedHealthStatus: 100x1 categorical

        Properties:
            Description:  Status Reported by Patient
        Values:

            Excellent       34   
            Fair            15   
            Good            40   
            Poor            11   

结构体和元胞数组没有用于存储元数据的属性。

另请参阅

|

相关主题