【问题标题】:Deleting rows depending on two conditions - Matlab根据两个条件删除行 - Matlab
【发布时间】:2014-06-24 17:06:32
【问题描述】:

我在 Matlab 中有一个由 FIRM 按字母顺序组织的单元格类型变量。每个 FIRM 将对应不同且重复的 C1 和 C2。对于每个 FIRM,我想删除重复的 C2(和相应的行)。方法是选择 D2 离 D1 最远的行。

初始单元格:

FIRMS C1 C2 D1 D2 D3 'ACRO' '01464''043605' '19961231''19970212''19970401' 'ACRO' '01464''043605' '19961231''19970119''19970313' 'ACMJ' '00118''043605' '19961231''19970114''19970219' 'ACMJ' '01464''000151' '19961231''19970121''19970218' 'ACMJ' '00192''007960''19961231''19970523''19970728'

最终单元:

'ACRO' '01464''043605' '19961231''19970212''19970401' 'ACMJ' '00192''007960''19961231''19970523''19970728'

谁能帮帮我?提前非常感谢。

【问题讨论】:

  • 一种可能性是按公司划分单元格,然后我只需要应用日期的条件。我会这样尝试,对我来说很简单,可能效率不高。
  • 创建一个值为 abs(D1-D2) 的新列,根据最低行索引上具有最高值的列对数组进行排序,然后沿第一列使用唯一的

标签: string matlab cell conditional-statements


【解决方案1】:

试试这个

a = initial_cell;
b = (abs(str2num(cell2mat(a(:,4))) - str2num(cell2mat(a(:,5)))));
[temp ind1] = sort(b);
s  = a(ind1(end:-1:1),:);
[temp1 ind2 temp2] = unique(strcat(s(:,1),s(:, 3)));
out_cell = s(ind2,:);

输出是

out_cell = 

'ACMJ'    '01464'    '000151'    '19961231'    '19970121'    '19970218'
'ACMJ'    '00192'    '007960'    '19961231'    '19970523'    '19970728'
'ACMJ'    '00118'    '043605'    '19961231'    '19970114'    '19970219'
'ACRO'    '01464'    '043605'    '19961231'    '19970119'    '19970313'

请注意,out_cell 在此输出中按 FIRM 排序,而在问题所述输出中未按 FIRM 排序。如果您需要,请通知我。

【讨论】:

  • 嘿!我做的绝对值不同:a = xx; b = (abs(cellfun(@minus,a(:,8),a(:,7)))); b=num2cell(b); a(:,end+1)=b; 但你的方式更简洁!谢谢!效果很好!只是一件事,我在你的第二行中取出了str2num,因为Matlab给了我错误。(也许只是在我的代码中)非常感谢! :)
  • 我正在验证代码,尽管它可以正常工作,但每个公司只有一个C2!这不是我的目标!我希望每个公司都有几个 C2,我只是不希望他们在自己内部重复!对不起,我没有让自己明白!我现在将研究这个主题!
  • @user3557054 试试看,我已经更改了选择唯一 C2 值的答案,之前它选择了唯一的 FIRM 值,这是我的错误,我没有正确阅读问题。如果还有错误请告诉我
  • 我已经尝试过类似于您编辑的内容:[temp1 ind2 temp2] = unique(cell2mat(s(:,3)),'sorted') 但我也意识到这是错误的!因为我要的是两个条件。例如:公司 ACMJ 将有 10 个不同的 C2 值,但这并不意味着其中一个也不会出现在公司 ACRO 中。所以我不能按 C2 排序!我会尝试使用&
  • @user3557054 尝试编辑后的答案,我认为它现在可以工作了,抱歉我之前没有检查过
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
相关资源
最近更新 更多