MATLAB学习文档(二十一)

目录

[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、<undefined> 等缺失值也作为一个独立的组进行计数。默认为 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 |

相关推荐
吃好睡好便好1 天前
芒种时节如何保健
学习·生活
lizhihai_991 天前
股市学习心得-A股服务器/算力服务器龙头
大数据·运维·服务器·人工智能·科技·学习
烛之武1 天前
Pytorch学习笔记(1)
pytorch·笔记·学习
飞翔中文网1 天前
Java学习笔记之反射
java·笔记·学习
知南x1 天前
【DPDK核心知识了解】(2) 内核旁路与硬件交互
学习
零陵上将军_xdr1 天前
后端转全栈学习-Day4-JavaScript 基础-2
开发语言·javascript·学习
一楼的猫1 天前
叙事指纹93.2%的技术确认与AI写作同质化——网文创作的差异化路径分析
人工智能·学习·机器学习·写作·ai写作
red_redemption1 天前
自由学习记录(199)
学习·dram 二線廠商·git partclone·4y halving 減半·3.125btc·手續費 sat/vb
拾光向日葵1 天前
江西物理类本科线上30—50分,能报南昌科技职业大学本科专业吗?
学习·其他
AI_零食1 天前
健身室器材管理系统鸿蒙PC Electron框架编写深度解析
前端·javascript·学习·华为·electron·前端框架·鸿蒙