删除仅包含特定值的重复连续单元格(MATLAB)

删除仅包含特定值的重复连续单元格(MATLAB),matlab,Matlab,我有一件非常具体的事情需要Matlab来做,我真的不知道该怎么做 以下是我正在使用的示例: 'B4,9(55)' 'B4,9(55)' 'B2,16,25(99)' 'B2,16,25(99)' 'B17,21,28,29(46)' 'B4,10(56)' 'B4,10(56)' 'B2,15,25(99)' 'B17,20,27,29(45)' 我需要一个脚本,将删除连续的,重复的条目,但只有当它包含一个特定的字符串(即,52,55和56)。不应删除带有(99)的重复条目。因此,我希望最终的

我有一件非常具体的事情需要Matlab来做,我真的不知道该怎么做

以下是我正在使用的示例:

'B4,9(55)'
'B4,9(55)'
'B2,16,25(99)'
'B2,16,25(99)'
'B17,21,28,29(46)'
'B4,10(56)'
'B4,10(56)'
'B2,15,25(99)'
'B17,20,27,29(45)'
我需要一个脚本,将删除连续的,重复的条目,但只有当它包含一个特定的字符串(即,52,55和56)。不应删除带有(99)的重复条目。因此,我希望最终的结果是:

'B4,9(55)'
'B2,16,25(99)'
'B2,16,25(99)'
'B17,21,28,29(46)'
'B4,10(56)'
'B2,15,25(99)'
'B17,20,27,29(45)'
这可能吗


编辑:一些更大的上下文。。。 我在一个脑电图实验室工作,我们用Matlab分析我们的数据。打开Matlab后,我运行“eeglab”。然后我打开一个set文件。我运行一个脚本,创建一个EEG事件列表,并删除我不想要的某些事件类型

%create a list of events
justevents = {EEG.event.type};

%delete the 201-203s
justevents(strcmp(justevents,'201'))=[];
justevents(strcmp(justevents,'202'))=[];
justevents(strcmp(justevents,'203'))=[];

%delete the 101-130s
justevents(strcmp(justevents,'101'))=[];
justevents(strcmp(justevents,'102'))=[];
justevents(strcmp(justevents,'103'))=[];
justevents(strcmp(justevents,'104'))=[];
justevents(strcmp(justevents,'105'))=[];
(这一直到130)

然后我运行Suever给我的代码,但它删除了52、55和56个事件

这里是一个更大的示例数据块,包括我在上面包含的代码中删除的内容。我不确定如何正确格式化,但这是Matlab输出

mycell = { ...

'B1,12,25(99)'    '201'    '101'    'B18,23,27,29(45)'    'B3,6(55)' ...
'B3,6(55)'    'B2,16,25(99)'    '201'    '102'    'B17,21,28,29(46)' ...
'B4,10(56)'    'B4,10(56)'    'B1,13,25(99)'    '201'    '201'    '103' ...
'B18,24,28,29(46)'    'B3,7(56)'    'B3,7(56)'    'B2,14,25(99)'    '201' ...
'104'    'B17,19,26,29(42)'    'B4,8(52)'    'B4,8(52)'    'B1,13,25(99)' ...
'201'    '105'    'B18,24,28,29(46)'    'B3,7(56)'}

解决这个问题的一种方法是首先找到所有重复的字符串,并为每个唯一的字符串分配一个索引。您可以使用
ismember
的第二个输出轻松完成此操作

[~, unique_ind] = ismember(mycell, mycell);
然后,我们可以通过找到具有相同索引值的序列的位置来识别连续的重复项。我们可以通过查看差值是否为零来检查这一点

consec_dupes = [false, diff(unique_ind) == 0];
然后,我们可以查看每一个重复值的情况,并通过使用正则表达式查看它们是否符合标准。如果在字符串中找到53、55或56,则以下为
true
,否则为
false

ismatch = ~cellfun(@isempty, regexp(mycell(consec_dupes), '\(52|55|56\)'));
现在,我们希望忽略所有与指定数字不匹配的连续重复项。为此,我们现在可以设置所有与
false
不匹配的
concer\u dups

consec_dupes(consec_dupes) = ismatch;
现在,我们只需从原始单元格数组中删除这些连续的重复项

mycell(consec_dupes) = [];
总结 因此,将所有这些整合到一块代码中:

[~, unique_ind] = ismember(mycell, mycell);
consec_dupes = [false, diff(unique_ind) == 0];
ismatch = ~cellfun(@isempty, regexp(mycell(consec_dupes), '\(52|55|56\)'));
consec_dupes(consec_dupes) = ismatch;
mycell(consec_dupes) = [];
将此应用于您的样本数据,我们得到以下结果:

'B1,12,25(99)'
'201'
'101'
'B18,23,27,29(45)'
'B3,6(55)'
'B2,16,25(99)'
'201'
'102'
'B17,21,28,29(46)'
'B4,10(56)'
'B1,13,25(99)'
'201'
'201'
'103'
'B18,24,28,29(46)'
'B3,7(56)'
'B2,14,25(99)'
'201'
'104'
'B17,19,26,29(42)'
'B4,8(52)'
'B1,13,25(99)'
'201'
'105'
'B18,24,28,29(46)'
'B3,7(56)'

首先,您必须将字符串放入单元格中

cell = {'B4,9(55)',
'B4,9(55)',
'B2,16,25(99)',
'B2,16,25(99)',
'B17,21,28,29(46)',
'B4,10(56)',
'B4,10(56)',
'B2,15,25(99)',
'B17,20,27,29(45)'};
然后,这只是一个选项,您可以通过组合两个索引来选择数据

[~,index1] = unique(cell); %find the uniques strings.
index2 = find(cellfun(@isempty,strfind(cell,'99'))==0); %find the string that contains '99'
index = unique([index1;index2]);

mycell = cell(sort(index))

我认为这个解决方案非常接近工作,我感谢你的帮助!当我测试我在这里包含的示例数据集时,它非常有效。但是,当我在数据上下文中测试它时,代码会删除其中包含52、55和56的所有单元格。知道为什么吗?我包含的示例数据集直接取自我实验室生成的数据文件,因此我不太明白为什么它会删除所有52、55和56个案例,而不是duplicates@ChristieSmith嗯,我无法复制。你能在你的原始问题中发布一些可能触发此问题的示例数据吗?@ChristieSmith还请确保你已经复制了所有行。省略
toremove(inds(aind))=false
行肯定会导致您提到的问题
toremove(inds(aind))=false
肯定存在:(我已经在我的原始帖子中包含了数据的上下文-如果我需要添加任何其他内容,请告诉我!一旦我正确格式化stackoverflow,我将很快添加更大的数据块…而且,justevents给出了一个1x514的矩阵。在测试代码时,我做了
data=transpose(justevents)
以使其与示例数据集的格式匹配,但它仍然删除52,55,56个事件。我相信OP想要指定要删除的项目,而不一定要排除哪些项目。