目录
[10.3 基于表格进行数据分析](#10.3 基于表格进行数据分析)
[10.3.1 统计表中分组元素的数量](#10.3.1 统计表中分组元素的数量)
[1. groupcounts 函数用法 (R2019a 及以上版本)](#1. groupcounts 函数用法 (R2019a 及以上版本))
语法
参数含义
举例
[2. groupcounts 函数在低版本的替代方案](#2. groupcounts 函数在低版本的替代方案)
[方法一:unique + accumarray (通用性强)](#方法一:unique + accumarray (通用性强))
方法二:crosstab (适用于分类变量)
[10.3.2 按组汇总、变换和过滤](#10.3.2 按组汇总、变换和过滤)
[1. groupsummary 函数 (R2018a 及以上版本)](#1. groupsummary 函数 (R2018a 及以上版本))
语法
参数含义
举例
[groupsummary 在低版本的替代方案](#groupsummary 在低版本的替代方案)
方法一:grpstats (需要工具箱)
[方法二:unique + accumarray (通用但复杂)](#方法二:unique + accumarray (通用但复杂))
[2. grouptransform 函数 (R2018b 及以上版本)](#2. grouptransform 函数 (R2018b 及以上版本))
语法
参数含义
举例
[grouptransform 在低版本的替代方案](#grouptransform 在低版本的替代方案)
[3. groupfilter 函数 (R2019b 及以上版本)](#3. groupfilter 函数 (R2019b 及以上版本))
语法
参数含义
举例
[groupfilter 在低版本的替代方案](#groupfilter 在低版本的替代方案)
[4. 实时编辑器任务: 按组计算 (R2021b 及以上版本)](#4. 实时编辑器任务: 按组计算 (R2021b 及以上版本))
使用方法
优点
缺点
[10.3.3 数据透视表](#10.3.3 数据透视表)
[pivot 函数](#pivot 函数)
语法
参数含义
举例
[pivot2 or pivot](#pivot2 or pivot)
函数汇总
表1:groupcounts函数总结
表2:groupsummary函数总结
表3:grouptransform函数总结
表4:groupfilter函数总结
表5:分组操作函数对比
表6:低版本替代方案对比
表7:数据透视表相关函数对比
10.3 基于表格进行数据分析
10.3.1 统计表中分组元素的数量
|-----------|----------------------------------|---------------------------------------------------------|--------------------------------------|
| 特性 | groupcounts (R2019a+) | 低版本替代方案 ( unique + accumarray ) | 低版本替代方案 ( crosstab ) |
| 函数名 | groupcounts | unique, accumarray | crosstab |
| 核心功能 | 直接计算单个或多个变量的分组计数 | 先找唯一值,再按索引累加 | 生成交叉表,可用于单变量计数 |
| 语法简洁性 | 非常高 ,一行代码完成 | 较低 ,需要多步操作和组合 | 中等 ,但主要用于交叉分析 |
| 输出结果 | 表或数组,可轻松获取百分比、累积百分比 | 需要手动构建结果表 | 需要手动构建结果表 |
| 数值分组 | 原生支持 ,通过 bin 参数轻松实现 | 需要先用 discretize 函数进行分箱,再计数 | 不直接支持,需预处理 |
| 缺失值处理 | 通过 'IncludeMissingGroups' 参数灵活控制 | unique 默认忽略 NaN,需特殊处理才能包含 | 默认忽略 NaN |
| 推荐场景 | 首选 ,所有R2019a及以上版本的分组计数任务 | 在无法使用高版本函数时,作为通用且强大的替代方案 | 主要用于两个或多个分类变量的交叉分析,单变量计数略显笨拙 |
1. groupcounts 函数用法 (R2019a 及以上版本)
groupcounts 函数用于计算表中变量、数组或分类数组中每个唯一值(或分组)出现的次数。
它返回一个包含各组及其计数的表或数组。
这是进行频率统计最直接、最高效的函数。
语法
% 基本语法:对单个变量进行分组计数
B = groupcounts(A)
B = groupcounts(A, groupvars)
% 带有分组区间的语法(适用于数值型数据)
B = groupcounts(A, groupvars, bin)
% 语法:返回包含多列的表,包含分组、计数、百分比和累积百分比
B, BG\] = groupcounts(A, groupvars, bin)
\[B, BG, ...\] = groupcounts(A, groupvars, bin, 'IncludeMissingGroups', true)
###### 参数含义
|----------------------------|--------------------------------------------------------------------------------|
| 参数 | 描述 |
| **A** | 输入数据。可以是表、时间表、向量或矩阵。如果是表或时间表,groupvars 指定要分组的列。如果是向量或矩阵,则直接对其元素进行分组计数。 |
| **groupvars** | (可选) 分组变量。当 A 是表或时间表时,指定用于分组的列名、列号或逻辑数组。例如 {'Location', 'Product'}。 |
| **bin** | (可选) 分组方式。用于数值型数据,可以是一个标量(表示分组数量)、一个边界的单调递增向量(如 \[0, 10, 20\]),或一个持续时间/日期时间数组。 |
| **'IncludeMissingGroups'** | (可选) 逻辑值。true 表示将 NaN、\ 等缺失值也作为一个独立的组进行计数。默认为 false。 |
###### 举例
假设我们有一个销售数据表 T。
% 创建示例数据表
Name = {'Li'; 'Wang'; 'Li'; 'Zhang'; 'Wang'; 'Li'};
Product = {'A'; 'B'; 'A'; 'C'; 'B'; 'A'};
Quantity = \[5; 3; 5; 2; 3; 5\];
T = table(Name, Product, Quantity);
% --- 示例 1: 统计每个 'Name' 的销售次数 ---
countsByName = groupcounts(T, 'Name')
% 输出:
% countsByName =
% 3×2 table
% Name GroupCount
% ______ __________
% 'Li' 3
% 'Wang' 2
% 'Zhang' 1
% --- 示例 2: 统计每个 'Product' 的销售次数,并包含百分比 ---
% 使用多个输出参数获取百分比信息
\[countsByProduct, \~, percent\] = groupcounts(T, 'Product');
countsByProduct.Percent = percent; % 将百分比信息添加到表中
disp('按产品分组计数及百分比:');
disp(countsByProduct);
% 输出:
% 按产品分组计数及百分比:
% Product GroupCount Percent
% _______ __________ _______
% 'A' 3 50
% 'B' 2 33.333
% 'C' 1 16.667
% --- 示例 3: 对 'Quantity' 进行区间分组计数 ---
% 将 Quantity 分为 3 个区间
quantityBinCounts = groupcounts(T, 'Quantity', 3)
% 输出 (区间边界由MATLAB自动计算):
% quantityBinCounts =
% 3×2 table
% Quantity GroupCount
% ____________ __________
% \[2, 3) 2
% \[3, 4) 2
% \[4, 5\] 2
##### 2. groupcounts 函数在低版本的替代方案
在 R2019a 之前的版本,没有 groupcounts 函数,通常使用以下两种方法组合实现。
###### 方法一:unique + accumarray (通用性强)
unique 函数用于找出所有唯一的分组项,accumarray 函数则根据这些分组项对数据进行累积计算(这里是求和,即计数)。
举例
% 使用与上面相同的表 T
% 目标:统计 'Name' 列中每个名字出现的次数
% 1. 使用 unique 找出所有唯一的名字和它们的索引
\[uniqueNames, \~, ic\] = unique(T.Name);
% 2. 使用 accumarray 进行计数
% ic 是一个索引向量,T.Name 的每个元素都对应 uniqueNames 中的一个位置。
% accumarray 会将 ic 中相同索引对应的值(这里是1)累加起来。
counts = accumarray(ic, 1);
% 3. 组合成结果表
lowVersionCounts = table(uniqueNames, counts, 'VariableNames', {'Name', 'GroupCount'});
disp('低版本替代方案结果:');
disp(lowVersionCounts);
% 输出与 groupcounts(T, 'Name') 相同
###### 方法二:crosstab (适用于分类变量)
crosstab 函数用于生成交叉表,即两个或多个分类变量的列联表。当只对一个变量进行统计时,它也能返回该变量的频数。
举例
% 目标:统计 'Name' 列中每个名字出现的次数
% crosstab 返回第一个变量的频数表
\[counts_crosstab, \~, \~, labels\] = crosstab(T.Name, {});
lowVersionCounts_crosstab = table(labels, counts_crosstab, 'VariableNames', {'Name', 'GroupCount'});
disp('低版本替代方案结果:');
disp(lowVersionCounts_crosstab);
% 输出与 groupcounts(T, 'Name') 相同
#### 10.3.2 按组汇总、变换和过滤
##### 1. groupsummary 函数 (R2018a 及以上版本)
groupsummary 函数是数据分析中的"瑞士军刀"。
它可以根据一个或多个分组变量,对数据表中的其他列应用指定的汇总方法(如 mean, sum, std 等),并返回一个汇总后的新表。
###### 语法
% 基本语法:对指定列进行默认汇总(数值列求mean,非数值列求numel)
B = groupsummary(A, groupvars)
% 语法:指定要汇总的列和汇总方法
B = groupsummary(A, groupvars, method, datavars)
B = groupsummary(A, groupvars, methods, datavars) % methods可以是多个方法的元胞数组
% 语法:使用匿名函数进行自定义汇总
B = groupsummary(A, groupvars, @(x) myFunction(x), datavars)
###### 参数含义
|------------------------|-------------------------------------------------------------------------|
| 参数 | 描述 |
| **A** | 输入的表或时间表。 |
| **groupvars** | 分组变量,指定按哪些列进行分组。 |
| **method** | 汇总方法,可以是字符串或函数句柄。例如 'mean', 'sum', 'std', 'min', 'max', 'numel' (计数) 等。 |
| **methods** | 多个汇总方法的元胞数组,如 {'mean', 'std'}。 |
| **datavars** | 需要应用 method 的数据列。 |
| **@(x) myFunction(x)** | 匿名函数,用于实现自定义的汇总逻辑。 |
###### 举例
继续使用上面的销售数据表 T。
% --- 示例 1: 计算每个 'Name' 的总销售量 ---
% groupvars='Name', method='sum', datavars='Quantity'
summaryByName = groupsummary(T, 'Name', 'sum', 'Quantity');
% 输出列名会自动变为 'sum_Quantity'
disp('按姓名汇总销售总量:');
disp(summaryByName);
% --- 示例 2: 计算每个 'Product' 的平均销售量和销售次数 ---
% methods={'mean', 'numel'}, datavars='Quantity'
summaryByProduct = groupsummary(T, 'Product', {'mean', 'numel'}, 'Quantity');
% 输出列名为 'mean_Quantity' 和 'numel_Quantity'
disp('按产品汇总平均销量和销售次数:');
disp(summaryByProduct);
% --- 示例 3: 多重分组汇总 ---
% 计算每个 'Name' 在每个 'Product' 上的总销售量
summaryByNameProduct = groupsummary(T, {'Name', 'Product'}, 'sum', 'Quantity');
disp('按姓名和产品多重分组汇总:');
disp(summaryByNameProduct);
##### groupsummary 在低版本的替代方案
低版本中,grpstats (Statistics and Machine Learning Toolbox) 是最接近的替代品。如果没有工具箱,则需使用 unique + accumarray 的复杂组合。
###### 方法一:grpstats (需要工具箱)
% 目标:计算每个 'Name' 的 'Quantity' 的平均值
% grpstats 的语法与 groupsummary 类似,但更侧重于统计量
meanQuantity = grpstats(T.Quantity, T.Name, 'mean');
% 输出是一个数组,需要手动添加分组信息
uniqueNames = unique(T.Name);
lowVersionSummary = table(uniqueNames, meanQuantity, 'VariableNames', {'Name', 'mean_Quantity'});
disp('使用 grpstats 的替代方案:');
disp(lowVersionSummary);
###### 方法二:unique + accumarray (通用但复杂)
% 目标:计算每个 'Name' 的 'Quantity' 的总和
% 1. 获取唯一名字和索引
\[uniqueNames, \~, ic\] = unique(T.Name);
% 2. 使用 accumarray 对 Quantity 按索引 ic 求和
% accumarray(ic, T.Quantity) 会将 T.Quantity 中对应相同 ic 的元素相加
sumQuantity = accumarray(ic, T.Quantity, \[\], @sum); % @sum 指定累加方式
% 3. 组合成结果表
lowVersionSummary_manual = table(uniqueNames, sumQuantity, 'VariableNames', {'Name', 'sum_Quantity'});
disp('使用 unique+accumarray 的替代方案:');
disp(lowVersionSummary_manual);
##### 2. grouptransform 函数 (R2018b 及以上版本)
grouptransform 函数与 groupsummary 不同,它不改变数据的行数,而是对每一组内的数据应用一个函数,并将结果返回到原始表的每一行中。
例如,计算每组内数据与该组均值的差值,或对每组数据进行标准化。
###### 语法
% 基本语法:对指定数据列按组进行变换
B = grouptransform(A, groupvars, datavars, method)
% 语法:使用匿名函数进行自定义变换
B = grouptransform(A, groupvars, datavars, @(x) myTransform(x))
###### 参数含义
|----------------------------------------------|-----------------------------------------------------------------------------|
| 参数 | 描述 |
| **A** **,** **groupvars** **,** **datavars** | 与 groupsummary 中的含义相同。 |
| **method** | 变换方法,如 'fillmissing' (用组内均值填充缺失值), 'zscore' (组内标准化), 'normalize' (组内归一化) 等。 |
| **@(x) myTransform(x)** | 自定义变换函数,输入 x 是某一组的数据,输出应是与 x 大小相同的变换后数据。 |
###### 举例
% 创建一个包含缺失值的新表 T2
Name = {'Li'; 'Wang'; 'Li'; 'Zhang'; 'Wang'; 'Li'};
Score = \[85; 92; 78; NaN; 88; 90\];
T2 = table(Name, Score);
% --- 示例 1: 用组内平均分填充缺失值 ---
% Zhang 的分数是 NaN,用 'Zhang' 组的平均分填充。但 'Zhang' 只有一个数据,所以无法计算。
% 我们修改一下,让 Wang 组也有一个 NaN
T2.Score(2) = NaN;
T2_filled = grouptransform(T2, 'Name', 'Score', 'fillmissing', 'mean');
disp('用组内均值填充缺失值后的表:');
disp(T2_filled);
% 'Wang' 的 NaN 会被 88 填充,'Zhang' 的 NaN 仍然是 NaN (因为组内只有一个NaN,无法计算均值)
% --- 示例 2: 计算每个人分数与该组平均分的差值 ---
% 这是一个典型的变换操作,需要自定义函数
T2_diff = grouptransform(T2, 'Name', 'Score', @(x) x - mean(x, 'omitnan'));
% 为了清晰,重命名列
T2_diff.Properties.VariableNames{2} = 'Score_DiffFromGroupMean';
disp('分数与组内均值差值:');
disp(T2_diff);
##### grouptransform 在低版本的替代方案
低版本中没有直接替代函数,必须手动实现。核心思路是:先计算每组的统计量(如均值),然后将这个统计量广播回原始表的每一行,最后进行计算。
举例 (实现上述示例2)
% 使用 T2 表
% 目标:计算每个人分数与该组平均分的差值
% 1. 使用 groupsummary (或其低版本替代方案) 计算每组的平均分
groupMeans = groupsummary(T2, 'Name', 'mean', 'Score');
% 2. 将计算出的组均值合并回原始表
% 使用 join 函数,基于 'Name' 列进行匹配
T2_joined = join(T2, groupMeans, 'Keys', 'Name');
% 3. 计算差值
T2_joined.Score_DiffFromGroupMean = T2_joined.Score - T2_joined.mean_Score;
% 4. (可选) 清理中间列
T2_final = T2_joined(:, {'Name', 'Score', 'Score_DiffFromGroupMean'});
disp('低版本实现组变换结果:');
disp(T2_final);
##### 3. groupfilter 函数 (R2019b 及以上版本)
groupfilter 函数根据组内数据的某些属性来决定是否保留整个组。
例如,只保留那些成员数量大于2的组,或者只保留组内最大值超过某个阈值的组。
###### 语法
% 基本语法:根据组内数据属性过滤组
B = groupfilter(A, groupvars, datavars, method)
% 语法:使用匿名函数定义过滤条件
B = groupfilter(A, groupvars, datavars, @(x) condition(x))
###### 参数含义
|----------------------------------------------|----------------------------------------------------------------------------------|
| 参数 | 描述 |
| **A** **,** **groupvars** **,** **datavars** | 与 groupsummary 中的含义相同。 |
| **method** | 过滤方法,如 'var' (保留组内方差大于0的组), 'nummissing' (保留包含缺失值的组), 'range' (保留组内极差大于指定值的组) 等。 |
| **@(x) condition(x)** | 自定义过滤函数。输入 x 是某一组的数据,输出必须是一个逻辑标量 (true 或 false)。true 表示保留该组,false 表示删除。 |
###### 举例
% 使用原始销售表 T
% --- 示例 1: 只保留销售次数超过1次的 'Name' ---
% 即,保留成员数量大于1的组
filteredByName = groupfilter(T, 'Name', 'Name', @(x) numel(x) \> 1);
disp('只保留销售次数超过1次的销售员:');
disp(filteredByName); % 'Zhang' 的记录被移除
% --- 示例 2: 只保留 'Quantity' 总和大于10的 'Product' ---
filteredByProduct = groupfilter(T, 'Product', 'Quantity', @(x) sum(x) \> 10);
disp('只保留总销量大于10的产品:');
disp(filteredByProduct); % 'B' 和 'C' 的记录被移除
##### groupfilter 在低版本的替代方案
低版本中,思路是:先找出要保留的组,再从原始表中筛选出属于这些组的行。
举例 (实现上述示例1)
% 使用 T 表
% 目标:只保留销售次数超过1次的 'Name'
% 1. 使用 groupsummary (或其低版本替代方案) 计算每组的数量
groupCounts = groupsummary(T, 'Name', 'numel', 'Name');
% 2. 找出满足条件的组名
namesToKeep = groupCounts.Name(groupCounts.GroupCount \> 1);
% 3. 从原始表中筛选出行
% 使用 ismember 函数检查 T.Name 是否在 namesToKeep 中
T_filtered = T(ismember(T.Name, namesToKeep), :);
disp('低版本实现组过滤结果:');
disp(T_filtered);
##### 4. 实时编辑器任务: 按组计算 (R2021b 及以上版本)
这是MATLAB提供的一种无需编写代码即可完成分组计算的方式。
在实时脚本(.mlx 文件)中,通过图形化界面配置分组变量、数据列和计算方法,MATLAB会自动生成相应的代码。
这对于快速探索数据、学习分组函数语法或为不熟悉编程的用户提供接口非常有用。
###### 使用方法
创建一个实时脚本 (.mlx)。
在"实时编辑器"选项卡中,点击"任务"库,找到并选择"按组计算"。
在任务窗格中:
选择输入数据:选择你的工作区中的表或时间表变量。
指定分组变量:选择一个或多个列进行分组。
选择要计算的方法:从下拉菜单中选择 mean, sum, std 等,或选择"自定义"。
选择要计算的数据:选择要应用计算方法的列。
任务会立即显示结果预览,并在脚本中插入可执行的代码块。你可以修改任务参数,代码会自动更新。
###### 优点
无需记忆函数语法和参数。
快速尝试不同的分组和计算方式,立即看到结果。
自动生成标准、规范的MATLAB代码,方便学习和后续集成到脚本中。
###### 缺点
只能在 .mlx 文件中使用。
对于非常复杂的自定义函数或嵌套逻辑,不如直接编写代码灵活。
#### 10.3.3 数据透视表
数据透视表是一种交互式的、综合性的数据汇总工具。
它允许用户通过拖拽字段(列)到不同的区域(行、列、值),快速地从不同维度对数据进行分类、汇总和分析。
MATLAB中的 pivot 函数就是用来创建数据透视表的。
##### pivot 函数
pivot 函数的本质可以看作是 groupsummary 的一个高级"包装器",专门用于生成交叉形式的汇总表,非常适合制作报告和进行多维度分析。
###### 语法
% 基本语法:创建数据透视表
P = pivot(T, Rows=rows_vars, Vars=data_vars, Method=method)
% 完整语法:包含行、列和多个数据/方法
P = pivot(T, Rows=rows_vars, Columns=cols_vars, Vars=data_vars, Method=method)
###### 参数含义
|-----------------------|----------------------------------------------|
| 参数 | 描述 |
| **T** | 输入的表或时间表。 |
| **Rows=rows_vars** | 指定作为透视表**行标签**的列。 |
| **Columns=cols_vars** | (可选) 指定作为透视表**列标签**的列。 |
| **Vars=data_vars** | 指定要填充到透视表**值区域**的数据列。 |
| **Method=method** | 指定对 data_vars 应用的**汇总方法**,如 'sum', 'mean' 等。 |
###### 举例
假设我们有一个更详细的销售数据表 T_sales。
% 创建示例数据
Region = {'East'; 'East'; 'West'; 'West'; 'East'; 'West'};
Product = {'A'; 'B'; 'A'; 'C'; 'B'; 'A'};
Quarter = {'Q1'; 'Q1'; 'Q2'; 'Q2'; 'Q3'; 'Q3'};
Revenue = \[100; 150; 200; 50; 180; 220\];
T_sales = table(Region, Product, Quarter, Revenue);
% --- 示例 1: 创建一个简单的数据透视表 ---
% 行: Region, 值: Revenue, 方法: sum
% 查看每个地区的总收入
pivot1 = pivot(T_sales, Rows="Region", Vars="Revenue", Method="sum");
disp('透视表1: 按地区汇总收入');
disp(pivot1);
% --- 示例 2: 创建一个二维数据透视表 ---
% 行: Region, 列: Product, 值: Revenue, 方法: sum
% 查看每个地区、每个产品的总收入
pivot2 = pivot(T_sales, Rows="Region", Columns="Product", Vars="Revenue", Method="sum");
disp('透视表2: 按地区和产品汇总收入');
disp(pivot2);
% 注意:没有数据的组合会显示为 NaN
% --- 示例 3: 多重汇总 ---
% 行: Region, 列: Quarter, 值: Revenue, 方法: {'mean', 'sum'}
% 查看每个地区、每个季度的平均收入和总收入
pivot3 = pivot(T_sales, Rows="Region", Columns="Quarter", Vars="Revenue", Method={'mean', 'sum'});
disp('透视表3: 按地区和季度汇总平均收入和总收入');
disp(pivot3);
% 输出的表会包含层次化的列名,如 'mean_Revenue' 和 'sum_Revenue'
数据透视表与 groupsummary 的关系
pivot 和 groupsummary 在功能上高度重叠,但呈现方式不同。
groupsummary:产生一个"扁平"的、长格式的汇总表。每一行代表一个唯一的分组组合。
% 等价于 pivot2 的 groupsummary 操作
gs_result = groupsummary(T_sales, {'Region', 'Product'}, 'sum', 'Revenue');
disp('等价的 groupsummary 结果:');
disp(gs_result);
输出结果与 pivot2 包含相同的信息,但格式不同。
##### pivot2 or pivot
pivot2:矩阵形式在视觉上更直观,便于比较。
pivot:产生一个"宽"的、矩阵式的交叉表。非常适合于报告和展示。当指定 Columns 参数时,pivot 的优势尤为明显。
如果你需要将汇总结果作为后续计算的输入,或者你的分组变量很多,导致交叉表非常稀疏,groupsummary 的长格式通常更易于处理。
如果你的目标是数据展示、报告制作或快速进行多维度比较,希望看到清晰的行列交叉结构,pivot 是更佳选择。
#### 函数汇总
##### 表1:groupcounts函数总结
|-------|-------------------------------------------------------------------------------------------|
| 项目 | 内容 |
| 函数名称 | groupcounts |
| 功能说明 | 计算表中变量、数组或分类数组中每个唯一值(或分组)出现的次数 |
| 引入版本 | R2019a |
| 基本语法 | B = groupcounts(A) B = groupcounts(A, groupvars) B = groupcounts(A, groupvars, binmethod) |
| 主要参数 | A: 输入表、数组或分类数组 groupvars: 分组变量名或索引 binmethod: 分组方法('auto', 'intervals', 'values'等) |
| 输出结果 | 包含分组变量和计数的表或数组 |
| 低版本替代 | crosstab, unique+histcounts或accumarray |
| 典型应用 | 数据分布统计、频数分析、数据质量检查 |
##### 表2:groupsummary函数总结
|-------|------------------------------------------------------------------------------------------------------------------------|
| 项目 | 内容 |
| 函数名称 | groupsummary |
| 功能说明 | 按一个或多个变量对数据进行分组,并计算每个组的汇总统计量 |
| 引入版本 | R2018a |
| 基本语法 | B = groupsummary(T, groupvars) B = groupsummary(T, groupvars, method) B = groupsummary(T, groupvars, method, datavars) |
| 主要参数 | T: 输入表 groupvars: 分组变量 method: 计算方法('mean', 'sum', 'std'等) datavars: 要计算的数据变量 |
| 输出结果 | 包含分组变量和汇总统计量的表 |
| 低版本替代 | varfun+findgroups或accumarray |
| 典型应用 | 分组统计、数据聚合分析、报表生成 |
##### 表3:grouptransform函数总结
|-------|-----------------------------------------------------------------------------------------------|
| 项目 | 内容 |
| 函数名称 | grouptransform |
| 功能说明 | 按组对数据进行变换,保持输出表与输入表行数相同 |
| 引入版本 | R2018b |
| 基本语法 | B = grouptransform(T, groupvars, datavars, method) |
| 主要参数 | T: 输入表 groupvars: 分组变量 datavars: 要变换的数据变量 method: 变换方法('zscore', 'normalize', 'fillmissing'等) |
| 输出结果 | 与输入表行数相同的表,包含变换后的数据 |
| 低版本替代 | varfun+findgroups或循环+accumarray |
| 典型应用 | 数据标准化、缺失值填充、组内排名计算 |
##### 表4:groupfilter函数总结
|-------|------------------------------------------------------------------------------------------------------------|
| 项目 | 内容 |
| 函数名称 | groupfilter |
| 功能说明 | 按组对数据进行过滤,保留满足条件的组 |
| 引入版本 | R2019b |
| 基本语法 | B = groupfilter(T, groupvars, datavars, method) B = groupfilter(T, groupvars, datavars, method, threshold) |
| 主要参数 | T: 输入表 groupvars: 分组变量 datavars: 要过滤的数据变量 method: 过滤方法('var', 'std', 'nummissing'等) threshold: 阈值 |
| 输出结果 | 包含满足条件的组的表 |
| 低版本替代 | findgroups+splitapply+逻辑索引 |
| 典型应用 | 数据质量控制、异常组检测、条件筛选 |
##### 表5:分组操作函数对比
|--------------------|------|----------|-------------|--------|
| 函数名称 | 主要功能 | 输出行数 | 典型应用场景 | 引入版本 |
| **groupcounts** | 计数统计 | 等于唯一组数 | 频数分析、分布统计 | R2019a |
| **groupsummary** | 分组汇总 | 等于唯一组数 | 数据聚合、报表生成 | R2018a |
| **grouptransform** | 分组变换 | 等于输入行数 | 数据标准化、缺失值处理 | R2018b |
| **groupfilter** | 分组过滤 | 小于等于输入行数 | 数据质量控制、条件筛选 | R2019b |
##### 表6:低版本替代方案对比
|--------------------|-----------------------|---------|---------------|
| 高版本函数 | 低版本替代方案 | 优点 | 缺点 |
| **groupcounts** | unique+histcounts | 代码简单直观 | 功能有限,不支持多变量分组 |
| **groupcounts** | crosstab | 支持多变量分组 | 输出格式不同,需要额外处理 |
| **groupsummary** | findgroups+splitapply | 灵活性高 | 代码复杂,需要多步操作 |
| **groupsummary** | accumarray | 功能强大 | 语法复杂,学习曲线陡峭 |
| **grouptransform** | varfun+findgroups | 相对简单 | 需要自定义函数 |
| **groupfilter** | findgroups+splitapply | 灵活性高 | 代码复杂,需要多步操作 |
##### 表7:数据透视表相关函数对比
|------------------|-----------|------|------------|--------|
| 函数名称 | 主要功能 | 输出格式 | 适用场景 | 引入版本 |
| **pivot** | 创建数据透视表 | 矩阵格式 | 数据展示、多维度比较 | R2022a |
| **groupsummary** | 分组汇总 | 表格式 | 数据分析、后续计算 | R2018a |
| **unstack** | 将长格式转为宽格式 | 表格式 | 数据重组 | R2013b |
| **stack** | 将宽格式转为长格式 | 表格式 | 数据重组 | R2013b |