Main Content

混合数据表

将相关数据存储在单个容器中

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

表由若干行向变量和若干列向变量组成。表中的变量可以有不同数据类型和不同大小,但变量必须有相同的行数。此外,变量中的数据是同构的,这使您能够将表变量视为数据数组。

例如,从 patients.mat MAT 文件中加载有关患者的样本数据。将血压数据合并到单个变量中。将名为 SelfAssessedHealthStatus 的四个类别变量(其值分别为 PoorFairGoodExcellent)转换为分类数组。查看几个变量的相关信息。

load patients
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                  

现在,从这些变量创建一个表并显示它。这些变量可以一起存储在一个表中,因为它们都具有相同的行数 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

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

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

考虑上述样本表。表 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  

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

用表属性描述数据

除了存储数据以外,表还具有可用来存储元数据的属性,例如变量名称、行名称、说明和变量单位。您可以使用 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   

与元胞数组比较

元胞数组可以在单个容器中为混合类型的数据提供存储,这一点与表相同。但与表不同是,元胞数组不提供描述其内容的元数据。它不强制其列中的数据保持同构。您无法使用行名称或列名称访问元胞数组的内容。

例如,使用 table2cell 函数将 T 转换为元胞数组。输出元胞数组包含相同的数据,但不包含关于该数据的信息。如果将此类信息附加到数据很重要,那么最好将其存储在表中,而不是存储在元胞数组中。

C = table2cell(T)
C=100×4 cell array
    {[38]}    {[1]}    {[124 93]}    {[Excellent]}
    {[43]}    {[0]}    {[109 77]}    {[Fair     ]}
    {[38]}    {[0]}    {[125 83]}    {[Good     ]}
    {[40]}    {[0]}    {[117 75]}    {[Fair     ]}
    {[49]}    {[0]}    {[122 80]}    {[Good     ]}
    {[46]}    {[0]}    {[121 70]}    {[Good     ]}
    {[33]}    {[1]}    {[130 88]}    {[Good     ]}
    {[40]}    {[0]}    {[115 82]}    {[Good     ]}
    {[28]}    {[0]}    {[115 78]}    {[Excellent]}
    {[31]}    {[0]}    {[118 86]}    {[Excellent]}
    {[45]}    {[0]}    {[114 77]}    {[Excellent]}
    {[42]}    {[0]}    {[115 68]}    {[Poor     ]}
    {[25]}    {[0]}    {[127 74]}    {[Poor     ]}
    {[39]}    {[1]}    {[130 95]}    {[Excellent]}
    {[36]}    {[0]}    {[114 79]}    {[Good     ]}
    {[48]}    {[1]}    {[130 92]}    {[Good     ]}
      ⋮

要访问元胞数组中的部分数据,只能使用带圆括号或花括号的索引。

C(1:5,1:3)
ans=5×3 cell array
    {[38]}    {[1]}    {[124 93]}
    {[43]}    {[0]}    {[109 77]}
    {[38]}    {[0]}    {[125 83]}
    {[40]}    {[0]}    {[117 75]}
    {[49]}    {[0]}    {[122 80]}

与结构体比较

结构体还可以为混合类型数据提供存储。结构体具有可以通过名称访问的字段,就像可以通过名称访问表变量一样。但是,它并不强制其字段中的数据保持同构。结构体不提供任何元数据来描述其内容。

例如,以类似于表变量的方式将 T 转换为标量结构体,其中每个字段均为一个数组。使用具有 ToScalar 名称-值参量的 table2struct 函数。

S = table2struct(T,ToScalar=true)
S = struct with fields:
                         Age: [100x1 double]
                      Smoker: [100x1 logical]
               BloodPressure: [100x2 double]
    SelfAssessedHealthStatus: [100x1 categorical]

在此结构体中,您可以通过使用字段名称来访问数据数组。

S.Age
ans = 100×1

    38
    43
    38
    40
    49
    46
    33
    40
    28
    31
      ⋮

但是,要访问字段中的部分数据,只能使用数值索引,并且一次只能访问一个字段。使用表行和变量索引可以更灵活地访问表中的数据。

S.Age(1:5)
ans = 5×1

    38
    43
    38
    40
    49

另请参阅

| | | |

相关主题