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

相关推荐
知识分享小能手2 小时前
React学习教程,从入门到精通,React 前后端交互技术详解(29)
前端·javascript·vue.js·学习·react.js·前端框架·react
月盈缺2 小时前
学习嵌入式的第三十九天——ARM——汇编
汇编·arm开发·学习
charlie1145141913 小时前
精读《C++20设计模式》:重新理解设计模式系列
学习·设计模式·c++20·攻略
宛 禾4 小时前
list的学习
c++·学习
科技林总4 小时前
【TS3】搭建本地开发环境
学习·typescript
能不能别报错4 小时前
K8s学习笔记(四) etcd组件
笔记·学习·kubernetes
川川菜鸟5 小时前
Matlab调用GPT-5 API示例
开发语言·gpt·matlab
励志成为美貌才华为一体的女子5 小时前
每日AI学习笔记----Qwen3-Omni 、HuatuoGPT-o1医学复杂推理
笔记·学习
程序边界6 小时前
深度学习学习路线图:从MNIST到MobileNetV4,从理论到实践的完整指南
人工智能·深度学习·学习