删除A、B列重复且D列为RED的行时遇MATLAB索引错误求助
问题描述
需求:当表格中两行的A列和B列值完全相同时,删除其中D列为RED的行。
示例表格:
A B C D 1 March-1st 2 RED 1 March-1st 3 GREEN 3 March-5th 8 GREEN 6 March-8th 4 GREEN 2 April-3rd 5 RED 2 April-3rd 0 GREEN
需删除第1行和第5行——它们的A、B列与其他行重复,且D列为RED。
现有MATLAB代码:
[G,GID] = findgroups(T.A,T.B); is_red = strcmp(T.D,"RED"); delete_row = false(size(T,1),1); for ii = 1:numel(GID) idx = G == GID{ii}; if nnz(idx) == 1 continue end delete_row(idx & is_red) = true; end T(delete_row,:) = []
执行时出现错误:
Error using tabular/parenDelete
Row index exceeds table dimensions.
Error in Parser
T(delete_row,:) = []
错误原因
核心问题是idx = G == GID{ii}这行逻辑错误:
G是findgroups返回的数值型分组索引向量(例如示例中G为[1;1;2;3;4;4],每个数字代表对应行的组号)GID{ii}是对应第ii组的(A,B)组合值(例如第一个元胞是[1, "March-1st"])
将数值向量与包含字符串的数组做相等比较,会生成二维逻辑数组,而非标记每行是否属于当前组的一维逻辑向量。后续操作会导致delete_row的维度或索引范围异常,最终触发表格索引越界错误。
修复方案
将循环内的idx计算改为基于分组编号的匹配,即idx = G == ii,因为ii是从1到组数的循环变量,与G的数值组号一一对应。
修复后的代码:
[G,GID] = findgroups(T.A,T.B); is_red = strcmp(T.D,"RED"); delete_row = false(size(T,1),1); % 遍历每个分组编号(ii对应G中的组号) for ii = 1:numel(GID) % 正确获取当前组的所有行索引 idx = G == ii; % 如果组内只有一行,无需处理 if nnz(idx) == 1 continue end % 标记组内D列为RED的行 delete_row(idx & is_red) = true; end % 删除标记的行 T(delete_row,:) = [];
验证结果
用示例表格测试修复后的代码:
- 分组1(A=1,B=March-1st):标记第1行(D=RED)为待删除
- 分组4(A=2,B=April-3rd):标记第5行(D=RED)为待删除
- 其他分组只有单行,跳过处理
最终表格会正确删除目标行,得到预期结果:
A B C D 1 March-1st 3 GREEN 3 March-5th 8 GREEN 6 March-8th 4 GREEN 2 April-3rd 0 GREEN
内容的提问来源于stack exchange,提问作者user23604607
相关产品推荐
相关产品推荐

