在给定特定条件的情况下从单元格中删除行

时间:2014-06-25 18:27:58

标签: matlab cell conditional-statements

我有一个由FIRM(A(:,2))整理的单元格类型大变量,我想要删除同一公司不会出现至少3次的所有行< / strong>连续。在这个例子中,A:

         FIRM 

 1997   'ABDR'  0,56    464 1641    19970224
 1997   'ABDR'  0,65    229 9208    19970424
 1997   'ABDR'  0,55    125 31867   19970218
 1997   'ABD'   0,06    435 8077    19970311
 1997   'ABD'   0,00    150 44994   19970804
1997    'ABFI'  2,07    154 46532   19971209

我只保留A:

1997    'ABDR'  0,56    464 1641    19970224
1997    'ABDR'  0,65    229 9208    19970424
1997    'ABDR'  0,55    125 31867   19970218

非常感谢。

注意:

我使用fopentextscan导入csv文件。 我对所有变量进行了一些更改以适应单元格类型变量

我将一些数字元素转换为叮咬

F_x=num2cell(Data{:,x});

我只用年份获得了新变量

F_ya=max(0,fix(log10(F_y)+1)-4);
F_yb=fix(F_y./10.^F_ya);
F_yc = num2cell(F_yb);

使用我需要的变量创建新单元格

A=[F_5C Data{:,1} Data{:,2} Data{:,3} Data{:,4} F_xa F_xb];

这意味着在单元格中我有一些变量是字符串而其他变量是数字。

1 个答案:

答案 0 :(得分:1)

我将假设您的名字存储在cell数组中。因此,您的名字实际上是:

names = {'ABDR', 'ABDR', 'ABDR', 'ABD', 'ABD', 'ABFI'};

然后我们可以使用strcmpi。这个函数的作用是将字符串比较两个字符串放在一起。如果字符串匹配则返回true,否则返回false。这也是不区分大小写的,因此ABDRabdr相同。

您可以这样致电strcmpi

v = strcmpi(str1, str2);

或者str2可以是单元格数组。这将如何工作是它将需要一个字符串str1并与单元格数组的每个单元格中的每个字符串进行比较。然后它将返回一个与str2大小相同的逻辑向量,表示我们是否在此特定位置匹配。

因此,我们可以遍历names的每个元素,并查看整个names单元格数组总共有多少匹配。然后我们可以通过检查names数组中每个名称是否至少有3个匹配或更多匹配来确定我们需要选择的位置。换句话说,我们简单地总结names内每个字符串的逻辑向量,并过滤那些总和为3或更多的字符串。我们可以使用cellfun来帮助我们执行此操作。就这样:

sums = cellfun(@(x) sum(strcmpi(x,names)), names);

这样做会给出:

sums =

 3     3     3     2     2     1

现在,我们需要那些有三个或更多的位置。就这样:

locations = sums >= 3

locations =

 1     1     1     0     0     0

因此,这些是可用于过滤矩阵的行。这也是逻辑向量。假设A包含您的数据,您只需执行A(locations,:)过滤掉特定名称出现三次或更多次的所有行。我真的不知道你是如何构建A的,所以我假设它像2D矩阵一样。如果您输入用于构建此矩阵的代码,我将修改我的帖子以使其适合您。无论如何,重要的是locations。这会告诉您需要选择哪些以符合您的条件。