Main Content

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

访问表中的数据

表是以变量形式存储列向数据的容器。表变量可以具有不同的数据类型和大小,只要所有变量具有相同的行数即可。表变量有名称,就像结构体的字段有名称一样。表的行可以有名称,但行名称不是必需的。要访问表数据,请使用行和变量的名称或数值索引对其进行索引。

对表进行索引的常见原因包括:

  • 对行和变量重新排序或删除它们。

  • 添加数组作为新的行或变量。

  • 提取数据数组以用作函数的输入参数。

表索引语法一览

根据您使用的索引类型,您可以访问子表或表中提取的数组。使用以下方式进行索引:

  • 圆括号 () 返回包含指定行和变量的表。

  • 圆点表示法以数组形式返回变量的内容。

  • 花括号 {} 返回由指定行和变量的内容串联而成的数组。

您可以通过名称、数值索引或数据类型指定行和变量。

  • 从 R2019b 开始,变量名称和行名称可以包含任何字符,包括空格和非 ASCII 字符。此外,它们可以由任何字符(而不仅仅是字母)开头。变量名称和行名称可以不是有效的 MATLAB® 标识符(由 isvarname 函数判别)。

  • 从 R2022a 开始,当您按名称指定行和变量时,您可以使用 pattern 对象来指定名称。例如,"Var" + digitsPattern 匹配以 Var 开头并以任意个数字结尾的所有名称。

输出的类型

语法

变量

示例

表,包含指定的行和变量

T(rows,vars)

指定为:

  • 行号(在 1m 之间)

  • 名称,如果 T 有行名称

  • 时间,如果 T 是时间表

  • 冒号 (:),表示所有行

指定为:

  • 变量编号(在 1n 之间)

  • 名称

  • 冒号 (:),表示所有变量

  • T(1:5,[1 4 5])

    表,包含 T 中第一个、第四个和第五个变量的前五行

  • T(:,["A","B"])

    表,包含名为 AB 的变量的所有行

  • T(:,"A" + wildcardPattern)

    表,包含名称以 A 开头的的变量的所有行

表,包含具有指定数据类型的变量

S = vartype(type);

T(rows,S)

指定为:

  • 行号(在 1m 之间)

  • 名称,如果 T 有行名称

  • 时间,如果 T 是时间表

  • 冒号 (:),表示所有行

指定为数据类型,如 "numeric""categorical""datetime"

  • S = vartype("numeric");

    T(1:5,S)

    表,包含 T 的前五行中的数值变量

数组,包含从一个变量中提取的数据

T.var

T.(expression)

未指定

指定为:

  • 变量名称(不带引号)

  • 圆括号内的表达式,返回变量名称或变量编号

  • T.Date

    从名为 Date 的表变量中提取的数组

  • T.("2019/06/30")

    从名为 2019/06/30 的表变量中提取的数组

  • T.(1)

    从第一个表变量中提取的数组

数组,包含从一个变量的指定行中提取的数据

T.var(rows)

T.(expression)(rows)

指定为数组的数值索引或逻辑索引

指定为:

  • 变量名称(不带引号)

  • 圆括号内的表达式,返回变量名称或变量编号

  • T.Date(1:5)

    从名为 Date 的表变量中所提取数组的前五行

  • T.("2019/06/30")(1:5)

    从名为 2019/06/30 的表变量中所提取数组的前五行

  • T.(1)(1:5)

    从第一个表变量中提取所数组的前五行

数组,串联来自指定的行和变量的数据

T{rows,vars}

指定为:

  • 行号(在 1m 之间)

  • 名称,如果 T 有行名称

  • 时间,如果 T 是时间表

  • 冒号 (:),表示所有行

指定为:

  • 变量编号(在 1n 之间)

  • 名称

  • 冒号 (:),表示所有变量

  • T{1:5,[1 4 5]}

    T 中第一个、第四个和第五个变量的前五行串联而成的数组

  • T{:,["A","B"]}

    由名为 AB 的变量的所有行串联而成的数组

  • T{:,"A" + wildcardPattern}

    由名称以 A 开头的所有行和变量串联而成的数组

数组,串联指定行和变量中具有指定数据类型的数据

S = vartype(type);

T{rows,S}

指定为:

  • 行号(在 1m 之间)

  • 名称,如果 T 有行名称

  • 时间,如果 T 是时间表

  • 冒号 (:),表示所有行

指定为数据类型,如 "numeric""categorical""datetime"

  • S = vartype("numeric");

    T{1:5,S}

    T 的前五行中的数值变量串联而成的数组

数组,串联变量的所有行的数据

T.Variables

未指定

未指定

  • T.Variables

    T{:,:} 返回的数组相同

使用指定行和变量进行表索引

将 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               

创建一个表并使用 AgeHeightWeightSmokerSelfAssessedHealthStatus 工作区变量填充它。将 LastName 中的唯一标识符用作行名称。T 是一个 100×5 表,包含 100 个行和 5 个变量。(当您指定行名称向量时,它不被视为表变量)。此外,将 SelfAssessedHealthStatus 转换为 categorical 变量,因为它只包含唯一值 ExcellentGoodFairPoor。当一个变量有一组固定的值(您可以将其视为列别)时,将该变量视为 categorical 数组会很有用。

SelfAssessedHealthStatus = categorical(SelfAssessedHealthStatus);
T = table(Age,Height,Weight,Smoker,SelfAssessedHealthStatus,...
    'RowNames',LastName)
T=100×5 table
                Age    Height    Weight    Smoker    SelfAssessedHealthStatus
                ___    ______    ______    ______    ________________________

    Smith       38       71       176      true             Excellent        
    Johnson     43       69       163      false            Fair             
    Williams    38       64       131      false            Good             
    Jones       40       67       133      false            Fair             
    Brown       49       64       119      false            Good             
    Davis       46       68       142      false            Good             
    Miller      33       64       142      true             Good             
    Wilson      40       68       180      false            Good             
    Moore       28       68       183      false            Excellent        
    Taylor      31       66       132      false            Excellent        
    Anderson    45       68       128      false            Excellent        
    Thomas      42       66       137      false            Poor             
    Jackson     25       71       174      false            Poor             
    White       39       72       202      true             Excellent        
    Harris      36       65       129      false            Good             
    Martin      48       71       181      true             Good             
      ⋮

使用数值索引或 end 关键字建立索引

创建一个包含表 T 中所有变量前五行的子表。要指定所需的行和变量,请使用圆括号内数值索引。这种类型的索引类似于对数值数组进行索引。

firstRows = T(1:5,:)
firstRows=5×5 table
                Age    Height    Weight    Smoker    SelfAssessedHealthStatus
                ___    ______    ______    ______    ________________________

    Smith       38       71       176      true             Excellent        
    Johnson     43       69       163      false            Fair             
    Williams    38       64       131      false            Good             
    Jones       40       67       133      false            Fair             
    Brown       49       64       119      false            Good             

您还可以使用 end 关键字来表示最后一行或最后一个变量。使用 end 关键字对表的最后五行进行索引。

lastRows = T(end-4:end,:)
lastRows=5×5 table
                 Age    Height    Weight    Smoker    SelfAssessedHealthStatus
                 ___    ______    ______    ______    ________________________

    Alexander    25       69       171      true                Good          
    Russell      44       69       188      true                Good          
    Griffin      49       70       186      false               Fair          
    Diaz         45       68       172      true                Good          
    Hayes        48       66       177      false               Fair          

除了数值索引,您还可以在圆括号中使用行或变量名称。(在本例中,使用行索引和冒号比使用行或变量名称更紧凑。)

使用名称建立索引

选择姓氏为 GriffinDiazHayes 的患者的所有数据。由于 T 中的行名称是患者的姓氏,请使用行名称对 T 进行索引。

rowsByName = T(["Griffin","Diaz","Hayes"],:)
rowsByName=3×5 table
               Age    Height    Weight    Smoker    SelfAssessedHealthStatus
               ___    ______    ______    ______    ________________________

    Griffin    49       70       186      false               Fair          
    Diaz       45       68       172      true                Good          
    Hayes      48       66       177      false               Fair          

您也可以按名称选择变量。创建一个表,其中只包含 THeightWeight 变量的前五行。显示该表。

variablesByName = T(1:5,["Height","Weight"])
variablesByName=5×2 table
                Height    Weight
                ______    ______

    Smith         71       176  
    Johnson       69       163  
    Williams      64       131  
    Jones         67       133  
    Brown         64       119  

表变量名称不必是有效的 MATLAB 标识符。它们可以包括空格和非 ASCII 字符,并且可以由任何字符开头。

例如,使用 renamevars 函数重命名 SelfAssessedHealthStatus 变量。添加空格和短横线,使变量名称更易读。然后使用变量名称对 T 进行索引。

T = renamevars(T,"SelfAssessedHealthStatus","Self-Assessed Health Status");
T(1:5,["Age","Smoker","Self-Assessed Health Status"])
ans=5×3 table
                Age    Smoker    Self-Assessed Health Status
                ___    ______    ___________________________

    Smith       38     true               Excellent         
    Johnson     43     false              Fair              
    Williams    38     false              Good              
    Jones       40     false              Fair              
    Brown       49     false              Good              

使用模式指定行名称或变量名称

当您指定表行名称或变量名称时,您可以使用定义文本匹配规则的模式。例如,您可以匹配以 "Var" 开头后跟任意数字的变量名称。您可以使用 pattern 对象、字符串和运算符构建模式表达式

例如,按行名称对 T 进行索引以查找患者姓氏以字母 G 开头的所有行。要匹配 G 后的任何字母,请使用 wildcardPattern 函数。

beginsWithG = "G" + wildcardPattern
beginsWithG = pattern
  Matching:

    "G" + wildcardPattern

T(beginsWithG,:)
ans=6×5 table
                Age    Height    Weight    Smoker    Self-Assessed Health Status
                ___    ______    ______    ______    ___________________________

    Garcia      27       69       131      true               Fair              
    Green       44       71       193      false              Good              
    Gonzalez    35       66       118      false              Fair              
    Gray        31       64       130      false              Excellent         
    Gonzales    48       71       174      false              Good              
    Griffin     49       70       186      false              Fair              

按变量名称对 T 进行索引以查找名称中包含 Status 的任何名称。

containsStatus = wildcardPattern + "Status" + wildcardPattern;
T(1:5,containsStatus)
ans=5×1 table
                Self-Assessed Health Status
                ___________________________

    Smith                Excellent         
    Johnson              Fair              
    Williams             Good              
    Jones                Fair              
    Brown                Good              

按变量的数据类型进行索引

除使用名称或编号指定变量外,您还可以创建一个数据类型下标来匹配具有相同数据类型的所有变量。

首先,通过使用 vartype 函数创建一个数据类型下标来匹配数值表变量。

subscriptObject = vartype("numeric")
subscriptObject = 
	table vartype subscript:

		Select table variables matching the type 'numeric'

	See Access Data in a Table.

创建一个只包含 T 中数值变量的表。Smoker 变量是逻辑变量,Self-Assessed Health Statuscategorical 变量,因此它们被排除在外。

onlyNumericVariables = T(:,subscriptObject)
onlyNumericVariables=100×3 table
                Age    Height    Weight
                ___    ______    ______

    Smith       38       71       176  
    Johnson     43       69       163  
    Williams    38       64       131  
    Jones       40       67       133  
    Brown       49       64       119  
    Davis       46       68       142  
    Miller      33       64       142  
    Wilson      40       68       180  
    Moore       28       68       183  
    Taylor      31       66       132  
    Anderson    45       68       128  
    Thomas      42       66       137  
    Jackson     25       71       174  
    White       39       72       202  
    Harris      36       65       129  
    Martin      48       71       181  
      ⋮

查找值符合逻辑条件的行

基于 patients MAT 文件中的数据创建另一个更小的表。

load patients.mat
T = table(Age,Height,Weight,Smoker);

要查找其中的值满足逻辑条件的表行,请使用逻辑索引。首先使用圆点表示法来访问表变量。然后,您可以根据表变量中的值是否满足您指定的条件来创建一个逻辑索引数组。使用逻辑索引对表进行索引。

使用圆点表示法从表变量中提取数据

要从表变量中提取数据,请使用圆点表示法。

例如,绘制表变量 Weight 中数值的直方图。使用圆点表示法,您可以将 T.Weight 视为数值数组。T.Weight 是包含 100 个行的双精度列向量。

histogram(T.Weight)
title("Patient Weights")

Figure contains an axes object. The axes object with title Patient Weights contains an object of type histogram.

对满足逻辑条件的行进行索引

您可以使用逻辑索引数组对数组或表进行索引。通常,您使用逻辑表达式来确定表变量中的哪些值满足逻辑条件。表达式的结果是一个逻辑索引数组。

例如,创建一个逻辑数组,用于匹配年龄小于 40 的患者。

rows = T.Age < 40
rows = 100x1 logical array

   1
   0
   1
   0
   0
   0
   1
   0
   1
   1
      ⋮

要提取年龄小于 40 的患者的身高数据,请使用 rowsHeight 变量进行索引。有 56 名患者的年龄小于 40

T.Height(rows)
ans = 56×1

    71
    64
    64
    68
    66
    71
    72
    65
    69
    69
      ⋮

您可以用逻辑索引对表进行索引。显示 T 中年龄小于 40 的患者的行。

T(rows,:)
ans=56×4 table
    Age    Height    Weight    Smoker
    ___    ______    ______    ______

    38       71       176      true  
    38       64       131      false 
    33       64       142      true  
    28       68       183      false 
    31       66       132      false 
    25       71       174      false 
    39       72       202      true  
    36       65       129      false 
    32       69       191      true  
    27       69       131      true  
    37       70       179      false 
    39       64       117      false 
    28       65       123      true  
    25       70       189      false 
    39       63       143      false 
    25       63       114      false 
      ⋮

您可以用一个逻辑表达式匹配多个条件。显示年龄小于 40 的烟民患者的行。

rows = (T.Smoker==true & T.Age<40);
T(rows,:)
ans=18×4 table
    Age    Height    Weight    Smoker
    ___    ______    ______    ______

    38       71       176      true  
    33       64       142      true  
    39       72       202      true  
    32       69       191      true  
    27       69       131      true  
    28       65       123      true  
    30       67       186      true  
    33       66       180      true  
    39       71       164      true  
    37       70       194      true  
    33       67       115      true  
    31       72       178      true  
    28       69       189      true  
    39       68       182      true  
    37       65       120      true  
    31       66       141      true  
      ⋮

圆点表示法支持任意变量名称或表达式

使用圆点表示法进行索引时,有两种方式可以指定变量。

  • 使用名称,不带引号。例如,T.Date 指定名为 "Date" 的变量。

  • 使用表达式,表达式置于点之后,用圆括号括起。例如,T.("Start Date") 指定名为 "Start Date" 的变量。

当表变量名称碰巧也是有效的 MATLAB® 标识符时,使用第一种语法。(有效的标识符以字母开头,仅包括字母、数字和下划线。)

指定下列各项时使用第二种语法:

  • 指示变量在表中位置的编号。

  • 不是有效 MATLAB 标识符的变量名称。

  • 一个函数,其输出是表中变量的名称,或是添加到表中的变量。函数的输出必须为字符向量或字符串标量。

例如,根据 patients MAT 文件创建一个表。然后使用圆点表示法来访问表变量的内容。

load patients

T = table(Age,Height,Weight,Smoker);

要按在表中的位置指定变量,请使用编号。AgeT 中的第一个变量,因此使用编号 1 来指定其位置。

T.(1)
ans = 100×1

    38
    43
    38
    40
    49
    46
    33
    40
    28
    31
      ⋮

要按名称指定变量,请或者在圆点后指定,或者用引号和圆括号将其括起来。由于 Age 是有效标识符,您可以使用 T.AgeT.("Age") 指定它。

T.Age
ans = 100×1

    38
    43
    38
    40
    49
    46
    33
    40
    28
    31
      ⋮

您指定的表变量名称不必是有效的 MATLAB 标识符。变量名称可以包括空格和非 ASCII 字符,并且可以由任何字符开头。但是,当您使用圆点表示法来访问具有此类名称的表变量时,您必须使用引号和圆括号来指定它。

例如,向 T 添加一个带空格和连字符的变量名称。

SelfAssessedHealthStatus = categorical(SelfAssessedHealthStatus);
T = addvars(T,SelfAssessedHealthStatus,'NewVariableNames',"Self-Assessed Health Status");
T(1:5,:)
ans=5×5 table
    Age    Height    Weight    Smoker    Self-Assessed Health Status
    ___    ______    ______    ______    ___________________________

    38       71       176      true               Excellent         
    43       69       163      false              Fair              
    38       64       131      false              Good              
    40       67       133      false              Fair              
    49       64       119      false              Good              

使用圆点表示法访问新的表变量。显示前五个元素。

healthStatus = T.("Self-Assessed Health Status");
healthStatus(1:5)
ans = 5x1 categorical
     Excellent 
     Fair 
     Good 
     Fair 
     Good 

您也可以将函数的输出用作变量名称。删除 T.("Self-Assessed Health Status") 变量。然后将其替换为名称包含当前日期的变量。

T.("Self-Assessed Health Status") = [];
T.(string(datetime("today")) + " Self Report") = SelfAssessedHealthStatus;
T(1:5,:)
ans=5×5 table
    Age    Height    Weight    Smoker    25-Jan-2022 Self Report
    ___    ______    ______    ______    _______________________

    38       71       176      true             Excellent       
    43       69       163      false            Fair            
    38       64       131      false            Good            
    40       67       133      false            Fair            
    49       64       119      false            Good            

从指定的行和变量中提取数据

使用花括号进行索引会从表中提取数据,并生成数组,而不是子表。但是,除上述差异外,您可以像使用圆括号进行索引时一样,使用编号、名称和数据类型下标来指定行和变量。要从表中提取值,请使用花括号。如果从多个表变量中提取值,则这些变量的数据类型必须支持它们彼此串联。

指定行和变量

基于 patients 文件中的数值和逻辑数组创建一个表。

load patients

T = table(Age,Height,Weight,Smoker,...
    'RowNames',LastName);

T 的多个变量中提取数据。与圆点表示法不同,使用花括号进行索引可以从多个表变量中提取值,并将它们串联成一个数组。

提取前 5 位患者的身高和体重。使用数值索引选择前五行,使用变量名称选择变量 HeightWeight

A = T{1:5,["Height","Weight"]}
A = 5×2

    71   176
    69   163
    64   131
    67   133
    64   119

A 是一个 5×2 数值数组,而不是表。

如果您指定一个变量名称,则花括号索引生成的数组与使用圆点表示法得到的数组相同。但是,在使用花括号索引时,必须同时指定行和变量。例如,语法 T.HeightT{:,"Height"} 返回相同的数组。

从所有行和变量中提取数据

如果所有表变量的数据类型都支持它们彼此串联,则可以使用 T.Variables 语法将所有表数据放入一个数组中。此语法等效于 T{:,:},其中冒号表示所有行和所有变量。如果该表有行名称,则它们不会包含在 T.Variables 的输出中。行名称不存储在表变量中。行名称是描述表的元数据的一部分。

A2 = T.Variables
A2 = 100×4

    38    71   176     1
    43    69   163     0
    38    64   131     0
    40    67   133     0
    49    64   119     0
    46    68   142     0
    33    64   142     1
    40    68   180     0
    28    68   183     0
    31    66   132     0
      ⋮

另请参阅

| | | |

相关主题