我有一个由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
非常感谢。
注意:
我使用fopen
和textscan
导入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];
这意味着在单元格中我有一些变量是字符串而其他变量是数字。
答案 0 :(得分:1)
我将假设您的名字存储在cell
数组中。因此,您的名字实际上是:
names = {'ABDR', 'ABDR', 'ABDR', 'ABD', 'ABD', 'ABFI'};
然后我们可以使用strcmpi
。这个函数的作用是将字符串比较两个字符串放在一起。如果字符串匹配则返回true
,否则返回false
。这也是不区分大小写的,因此ABDR
与abdr
相同。
您可以这样致电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
。这会告诉您需要选择哪些行以符合您的条件。