【问题标题】:Delete rows from a cell given a specific condition从给定特定条件的单元格中删除行
【发布时间】:2014-06-25 18:27:58
【问题描述】:

我有一个由 FIRM (A(:,2)) 排序的单元格类型大变量,我想删除同一家公司未出现至少 3 次的所有行> 连续。在这个例子中,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

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

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

【问题讨论】:

    标签: matlab cell conditional-statements


    【解决方案1】:

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

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

    然后我们可以使用strcmpi。这个函数的作用是string比较两个字符串。如果字符串匹配则返回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,所以我假设它就像一个二维矩阵。如果您输入用于构建此矩阵的代码,我将修改我的帖子以使其适合您。无论如何,重要的是locations。这会告诉您需要选择哪些以符合您的条件。

    【讨论】:

    • 非常感谢,这段代码解释得很好,我非常感谢,因为我可以学到更多。我的“名字”存储为cellarrays 是的!我现在正在应用它(如果它有效,我会告诉你),但我会尝试编辑我的问题,看看查看代码是否有帮助!谢谢!
    • @user3557054 - 好的,看起来您的姓名存储在Data{:,2} 中。我刚刚写的应该仍然有效。在这种情况下,names 就是Data{:,2}。然后,您将采用locations 并将您的矩阵子集A 仅选择我们讨论过的那些行。从您如何构建A 来看,这应该可以工作
    • 好的。我现在正在尝试,我也认为它会起作用。无论如何,我会在最后告诉你!谢谢
    • @user3557054 - 啊,我希望它起作用了!...看到你接受了我的回答:)。惊人的。祝你好运!
    • 是的,它成功了!我今天仍然想再次验证,但它正在工作!谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多