Create Tables and Assign Data to Them

Tables are suitable for column-oriented data such as tabular data from text files or spreadsheets. Tables store columns of data in variables. The variables in a table can have different data types, though all of the variables must have the same number of rows. However, table variables are not restricted to storing only column vectors. For example, a table variable can contain a matrix with multiple columns as long as it has the same number of rows as the other table variables.

In MATLAB®, you can create tables and assign data to them in several ways.

• Create a table from input arrays by using the `table` function.

• Add variables to an existing table by using dot notation.

• Assign variables to an empty table.

• Preallocate a table and fill in its data later.

• Convert variables to tables by using the `array2table`, `cell2table`, or `struct2table` functions.

• Read a table from file by using the `readtable` function.

• Import a table using the Import Tool.

The way you choose depends on the nature of your data and how you plan to use tables in your code.

Create Tables from Input Arrays

You can create a table from arrays by using the `table` function. For example, create a small table with data for five patients.

First, create six column-oriented arrays of data. These arrays have five rows because there are five patients. (Most of these arrays are 5-by-1 column vectors, while `BloodPressure` is a 5-by-2 matrix.)

```LastName = ["Sanchez";"Johnson";"Zhang";"Diaz";"Brown"]; Age = [38;43;38;40;49]; Smoker = [true;false;true;false;true]; Height = [71;69;64;67;64]; Weight = [176;163;131;133;119]; BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80];```

Now create a table, `patients`, as a container for the data. In this call to the `table` function, the input arguments use the workspace variable names for the names of the variables in `patients`.

`patients = table(LastName,Age,Smoker,Height,Weight,BloodPressure)`
```patients=5×6 table LastName Age Smoker Height Weight BloodPressure _________ ___ ______ ______ ______ _____________ "Sanchez" 38 true 71 176 124 93 "Johnson" 43 false 69 163 109 77 "Zhang" 38 true 64 131 125 83 "Diaz" 40 false 67 133 117 75 "Brown" 49 true 64 119 122 80 ```

The table is a 5-by-6 table because it has six variables. As the `BloodPressure` variable shows, a table variable itself can have multiple columns. This example shows why tables have rows and variables, not rows and columns.

Add Variable to Table Using Dot Notation

Once you have created a table, you can add a new variable at any time by using dot notation. Dot notation refers to table variables by name, `T.varname`, where `T` is the table and `varname` is the variable name. This notation is similar to the notation you use to access and assign data to the fields of a structure.

For example, add a `BMI` variable to `patients`. Calculate body mass index, or BMI, using the values in `patients.Weight` and `patients.Height`. Assign the BMI values to a new table variable.

`patients.BMI = (patients.Weight*0.453592)./(patients.Height*0.0254).^2`
```patients=5×7 table LastName Age Smoker Height Weight BloodPressure BMI _________ ___ ______ ______ ______ _____________ ______ "Sanchez" 38 true 71 176 124 93 24.547 "Johnson" 43 false 69 163 109 77 24.071 "Zhang" 38 true 64 131 125 83 22.486 "Diaz" 40 false 67 133 117 75 20.831 "Brown" 49 true 64 119 122 80 20.426 ```

Assign Variables to Empty Table

Another way to create a table is to start with an empty table and assign variables to it. For example, re-create the table of patient data, but this time assign variables using dot notation.

First, create an empty table, `patients2`, by calling `table` without arguments.

`patients2 = table`
```patients2 = 0x0 empty table ```

Next, create a copy of the patient data by assigning variables. Table variable names do not have to match array names, as shown by the `Name` and `BP` table variables.

```patients2.Name = LastName; patients2.Age = Age; patients2.Smoker = Smoker; patients2.Height = Height; patients2.Weight = Weight; patients2.BP = BloodPressure```
```patients2=5×6 table Name Age Smoker Height Weight BP _________ ___ ______ ______ ______ __________ "Sanchez" 38 true 71 176 124 93 "Johnson" 43 false 69 163 109 77 "Zhang" 38 true 64 131 125 83 "Diaz" 40 false 67 133 117 75 "Brown" 49 true 64 119 122 80 ```

Preallocate Table and Fill Rows

Sometimes you know the sizes and data types of the data that you want to store in a table, but you plan to assign the data later. Perhaps you plan to add only a few rows at a time. In that case, preallocating space in the table and then assigning values to empty rows can be more efficient.

For example, to preallocate space for a table to contain time and temperature readings at different stations, use the `table` function. Instead of supplying input arrays, specify the sizes and data types of the table variables. To give them names, specify the `'VariableNames'` argument. Preallocation fills table variables with default values that are appropriate for their data types.

```sz = [4 3]; varTypes = ["double","datetime","string"]; varNames = ["Temperature","Time","Station"]; temps = table('Size',sz,'VariableTypes',varTypes,'VariableNames',varNames)```
```temps=4×3 table Temperature Time Station ___________ ____ _________ 0 NaT <missing> 0 NaT <missing> 0 NaT <missing> 0 NaT <missing> ```

One way to assign or add a row to a table is to assign a cell array to a row. If the cell array is a row vector and its elements match the data types of their respective variables, then the assignment converts the cell array to a table row. However, you can assign only one row at a time using cell arrays. Assign values to the first two rows.

```temps(1,:) = {75,datetime('now'),"S1"}; temps(2,:) = {68,datetime('now')+1,"S2"}```
```temps=4×3 table Temperature Time Station ___________ ____________________ _________ 75 19-Aug-2023 14:31:33 "S1" 68 20-Aug-2023 14:31:33 "S2" 0 NaT <missing> 0 NaT <missing> ```

As an alternative, you can assign rows from a smaller table into a larger table. With this method, you can assign one or more rows at a time.

`temps(3:4,:) = table([63;72],[datetime('now')+2;datetime('now')+3],["S3";"S4"])`
```temps=4×3 table Temperature Time Station ___________ ____________________ _______ 75 19-Aug-2023 14:31:33 "S1" 68 20-Aug-2023 14:31:33 "S2" 63 21-Aug-2023 14:31:33 "S3" 72 22-Aug-2023 14:31:33 "S4" ```

You can use either syntax to increase the size of a table by assigning rows beyond the end of the table. If necessary, missing rows are filled in with default values.

`temps(6,:) = {62,datetime('now')+6,"S6"}`
```temps=6×3 table Temperature Time Station ___________ ____________________ _________ 75 19-Aug-2023 14:31:33 "S1" 68 20-Aug-2023 14:31:33 "S2" 63 21-Aug-2023 14:31:33 "S3" 72 22-Aug-2023 14:31:33 "S4" 0 NaT <missing> 62 25-Aug-2023 14:31:33 "S6" ```

Convert Variables to Tables

You can convert variables that have other data types to tables. Cell arrays and structures are other types of containers that can store arrays that have different data types. So you can convert cell arrays and structures to tables. You can also convert an array to a table where the table variables contain columns of values from the array. To convert these kinds of variables, use the `array2table`, `cell2table`, or `struct2table` functions.

For example, convert an array to a table by using `array2table`. Arrays do not have column names, so the table has default variable names.

`A = randi(3,3)`
```A = 3×3 3 3 1 3 2 2 1 1 3 ```
`a2t = array2table(A)`
```a2t=3×3 table A1 A2 A3 __ __ __ 3 3 1 3 2 2 1 1 3 ```

You can provide your own table variable names by using the `"VariableNames"` name-value argument.

`a2t = array2table(A,"VariableNames",["First","Second","Third"])`
```a2t=3×3 table First Second Third _____ ______ _____ 3 3 1 3 2 2 1 1 3 ```

Read Table from File

It is common to have a large quantity of tabular data in a file such as a CSV (comma-separated value) file or an Excel® spreadsheet. To read such data into a table, use the `readtable` function.

For example, the CSV file `outages.csv` is a sample file that is distributed with MATLAB. The file contains data for a set of electrical power outages. The first line of `outages.csv` has column names. The rest of the file has comma-separated data values for each outage. The first few lines are shown here.

```Region,OutageTime,Loss,Customers,RestorationTime,Cause SouthWest,2002-02-01 12:18,458.9772218,1820159.482,2002-02-07 16:50,winter storm SouthEast,2003-01-23 00:49,530.1399497,212035.3001,,winter storm SouthEast,2003-02-07 21:15,289.4035493,142938.6282,2003-02-17 08:14,winter storm West,2004-04-06 05:44,434.8053524,340371.0338,2004-04-06 06:10,equipment fault MidWest,2002-03-16 06:18,186.4367788,212754.055,2002-03-18 23:23,severe storm ... ```

To read `outages.csv` and store the data in a table, you can use `readtable`. It reads numeric values, dates and times, and strings into table variables that have appropriate data types. Here, `Loss` and `Customers` are numeric arrays. The `OutageTime` and `RestorationTime` variables are `datetime` arrays because `readtable` recognizes the date and time formats of the text in those columns of the input file. To read the rest of the text data into string arrays, specify the `"TextType"` name-value argument.

`outages = readtable("outages.csv","TextType","string")`
```outages=1468×6 table Region OutageTime Loss Customers RestorationTime Cause ___________ ____________________ ______ __________ ____________________ _________________ "SouthWest" 01-Feb-2002 12:18:00 458.98 1.8202e+06 07-Feb-2002 16:50:00 "winter storm" "SouthEast" 23-Jan-2003 00:49:00 530.14 2.1204e+05 NaT "winter storm" "SouthEast" 07-Feb-2003 21:15:00 289.4 1.4294e+05 17-Feb-2003 08:14:00 "winter storm" "West" 06-Apr-2004 05:44:00 434.81 3.4037e+05 06-Apr-2004 06:10:00 "equipment fault" "MidWest" 16-Mar-2002 06:18:00 186.44 2.1275e+05 18-Mar-2002 23:23:00 "severe storm" "West" 18-Jun-2003 02:49:00 0 0 18-Jun-2003 10:54:00 "attack" "West" 20-Jun-2004 14:39:00 231.29 NaN 20-Jun-2004 19:16:00 "equipment fault" "West" 06-Jun-2002 19:28:00 311.86 NaN 07-Jun-2002 00:51:00 "equipment fault" "NorthEast" 16-Jul-2003 16:23:00 239.93 49434 17-Jul-2003 01:12:00 "fire" "MidWest" 27-Sep-2004 11:09:00 286.72 66104 27-Sep-2004 16:37:00 "equipment fault" "SouthEast" 05-Sep-2004 17:48:00 73.387 36073 05-Sep-2004 20:46:00 "equipment fault" "West" 21-May-2004 21:45:00 159.99 NaN 22-May-2004 04:23:00 "equipment fault" "SouthEast" 01-Sep-2002 18:22:00 95.917 36759 01-Sep-2002 19:12:00 "severe storm" "SouthEast" 27-Sep-2003 07:32:00 NaN 3.5517e+05 04-Oct-2003 07:02:00 "severe storm" "West" 12-Nov-2003 06:12:00 254.09 9.2429e+05 17-Nov-2003 02:04:00 "winter storm" "NorthEast" 18-Sep-2004 05:54:00 0 0 NaT "equipment fault" ⋮ ```

Import Table Using Import Tool

Finally, you can interactively preview and import data from spreadsheets or delimited text files by using the Import Tool. There are two ways to open the Import Tool.

• MATLAB Toolstrip: On the Home tab, in the Variable section, click Import Data.

• MATLAB command prompt: Enter `uiimport(``filename``)`, where `filename` is the name of a text or spreadsheet file.

For example, open the `outages.csv` sample file by using `uiimport` and `which` to get the path to the file.

`uiimport(which("outages.csv"))`

The Import Tool shows you a preview of the six columns from `outages.csv`. To import the data as a table, follow these steps.

1. In the Imported Data section, select Table as the output type.

2. Click Import Selection (near the upper-right corner). The new table, named `outages`, appears in your workspace.