MATLAB 基础知识 数据类型 表 使用表的好处

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

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

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

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

load patients

然后,将工作区变量 Systolic 和 Diastolic 合并为单个 BloodPressure 变量,并将工作区变量 Gender 从字符向量元胞数组转换为分类数组。

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

whos('Gender','Age','Smoker','BloodPressure')
  Name                 Size            Bytes  Class          Attributes

  Age                100x1               800  double                   
  BloodPressure      100x2              1600  double                   
  Gender             100x1               330  categorical              
  Smoker             100x1               100  logical     

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

现在,基于这些变量创建一个表并显示前五行。

T = table(Gender,Age,Smoker,BloodPressure);
T(1:5,:)
ans=5×4 table
    Gender    Age    Smoker    BloodPressure
    ______    ___    ______    _____________

    Male      38     true       124     93  
    Male      43     false      109     77  
    Female    38     false      125     83  
    Female    40     false      117     75  
    Female    49     false      122     80  

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

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

Invalid RHS for assignment to a categorical array.

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

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

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

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

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

结构体数组中的字段与表中的变量相似。但是,与表不同的是,结构体数组不能在字段中强制实施同质化要求。例如,S.Gender 的一些值可能为分类数组元素 Male 或 Female,另一些值可能为字符向量 ‘Male’ 或 ‘Female’,其他一些值可能为整数 0 或 1。

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

ScalarStruct = struct(...
    'Gender',{Gender},...
    'Age',Age,...
    'Smoker',Smoker,...
    'BloodPressure',BloodPressure)
ScalarStruct = struct with fields:
           Gender: [100x1 categorical]
              Age: [100x1 double]
           Smoker: [100x1 logical]
    BloodPressure: [100x2 double]

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

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

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

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

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

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

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

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

T({'Williams','Brown'},{'Age','BloodPressure'})
ans=2×2 table
                Age    BloodPressure
                ___    _____________

    Williams    38      125     83  
    Brown       49      122     80

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

T(3:2:5,2:2:4)
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 = ...
    {'Male or Female' ...
    '' ...
    'true or false' ...
    'Systolic/Diastolic'};

T.Properties.VariableUnits{'Age'} = 'Yrs';

VariableDescriptions 的元胞数组中的各个空字符向量指示对应的变量没有说明。有关详细信息,请参阅 table 的“属性”部分。

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

summary(T)
Description:  Simulated Patient Data

Variables:

    Gender: 100x1 categorical

        Properties:
            Description:  Male or Female
        Values:

            Female       53   
            Male         47   

    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  

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结冰架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值