# Calculations on Tables

This example shows how to perform calculations on tables.

The functions `rowfun` and `varfun` each apply a specified function to a table, yet many other functions require numeric or homogeneous arrays as input arguments. You can extract data from individual variables using dot indexing or from one or more variables using curly braces. The extracted data is then an array that you can use as input to other functions. Starting in R2018a, you also can use the `groupsummary` function for calculations on groups of data in a table.

### Read Sample Data into Table

Read data from a comma-separated text file, `testScores.csv`, into a table using the `readtable` function. `testScores.csv` contains test scores for several students. Use the student names in the first column of the text file as row names in the table.

`T = readtable('testScores.csv','ReadRowNames',true)`
```T=10×4 table Gender Test1 Test2 Test3 __________ _____ _____ _____ HOWARD {'male' } 90 87 93 WARD {'male' } 87 85 83 TORRES {'male' } 86 85 88 PETERSON {'female'} 75 80 72 GRAY {'female'} 89 86 87 RAMIREZ {'female'} 96 92 98 JAMES {'male' } 78 75 77 WATSON {'female'} 91 94 92 BROOKS {'female'} 86 83 85 KELLY {'male' } 79 76 82 ```

`T` is a table with 10 rows and four variables.

### Summarize the Table

View the data type, description, units, and other descriptive statistics for each variable by using the `summary` function to summarize the table.

`summary(T)`
```Variables: Gender: 10x1 cell array of character vectors Test1: 10x1 double Values: Min 75 Median 86.5 Max 96 Test2: 10x1 double Values: Min 75 Median 85 Max 94 Test3: 10x1 double Values: Min 72 Median 86 Max 98 ```

The summary contains the minimum, median, and maximum score for each test.

### Find the Average Across Each Row

Extract the data from the second, third, and fourth variables using curly braces, `{}`, find the average of each row, and store it in a new variable, `TestAvg`.

`T.TestAvg = mean(T{:,2:end},2)`
```T=10×5 table Gender Test1 Test2 Test3 TestAvg __________ _____ _____ _____ _______ HOWARD {'male' } 90 87 93 90 WARD {'male' } 87 85 83 85 TORRES {'male' } 86 85 88 86.333 PETERSON {'female'} 75 80 72 75.667 GRAY {'female'} 89 86 87 87.333 RAMIREZ {'female'} 96 92 98 95.333 JAMES {'male' } 78 75 77 76.667 WATSON {'female'} 91 94 92 92.333 BROOKS {'female'} 86 83 85 84.667 KELLY {'male' } 79 76 82 79 ```

Alternatively, you can use the variable names, `T{:,{'Test1','Test2','Test3'}}` or the variable indices, `T{:,2:4}` to select the subset of data.

### Compute Statistics Using Grouping Variable

Compute the mean and maximum of `TestAvg` by gender of the students. First, compute the means by using the `varfun` function.

```varfun(@mean,T,'InputVariables','TestAvg',... 'GroupingVariables','Gender')```
```ans=2×3 table Gender GroupCount mean_TestAvg __________ __________ ____________ {'female'} 5 87.067 {'male' } 5 83.4 ```

Starting in R2018a, you also can use the `groupsummary` function to perform computations on groups of data in a table. Compute the maximum values of `TestAvg` for each group of students using `groupsummary`.

`groupsummary(T,'Gender','max','TestAvg')`
```ans=2×3 table Gender GroupCount max_TestAvg __________ __________ ___________ {'female'} 5 95.333 {'male' } 5 90 ```

### Replace Data Values

The maximum score for each test is 100. Use curly braces to extract the data from the table and convert the test scores to a 25 point scale.

`T{:,2:end} = T{:,2:end}*25/100`
```T=10×5 table Gender Test1 Test2 Test3 TestAvg __________ _____ _____ _____ _______ HOWARD {'male' } 22.5 21.75 23.25 22.5 WARD {'male' } 21.75 21.25 20.75 21.25 TORRES {'male' } 21.5 21.25 22 21.583 PETERSON {'female'} 18.75 20 18 18.917 GRAY {'female'} 22.25 21.5 21.75 21.833 RAMIREZ {'female'} 24 23 24.5 23.833 JAMES {'male' } 19.5 18.75 19.25 19.167 WATSON {'female'} 22.75 23.5 23 23.083 BROOKS {'female'} 21.5 20.75 21.25 21.167 KELLY {'male' } 19.75 19 20.5 19.75 ```

### Change Variable Name

Change the variable name from `TestAvg` to `Final`.

`T.Properties.VariableNames{end} = 'Final'`
```T=10×5 table Gender Test1 Test2 Test3 Final __________ _____ _____ _____ ______ HOWARD {'male' } 22.5 21.75 23.25 22.5 WARD {'male' } 21.75 21.25 20.75 21.25 TORRES {'male' } 21.5 21.25 22 21.583 PETERSON {'female'} 18.75 20 18 18.917 GRAY {'female'} 22.25 21.5 21.75 21.833 RAMIREZ {'female'} 24 23 24.5 23.833 JAMES {'male' } 19.5 18.75 19.25 19.167 WATSON {'female'} 22.75 23.5 23 23.083 BROOKS {'female'} 21.5 20.75 21.25 21.167 KELLY {'male' } 19.75 19 20.5 19.75 ```