【问题标题】:Filter on parts of words in Matlab tables过滤 Matlab 表格中的部分单词
【发布时间】:2016-02-09 15:45:00
【问题描述】:

与 Excel 类似,我需要了解如何过滤掉表格中不包含特定字符串的行。

例如,我只需要包含字母“MX”的行。在工作表中,有些行包含 ZMX01、MX002 和 US001 等字符串。我想要前两行。

这似乎是一个简单的问题,所以我很惊讶我找不到任何帮助!

类似问题Filter on words in Matlab tables (as in Excel)

【问题讨论】:

  • 你看过mathworks.com/help/stats/…了吗(我用谷歌搜索了“matlab select”这个搜索词)
  • 您是从文本文件中过滤数据,还是将数据加载到 MATLAB 工作区?

标签: matlab


【解决方案1】:

您可能无法在 MATLAB 中找到很多有关表格的信息,因为它们是在不久前的 R2013a 版本中引入的,那个。所以,关于你的问题:让我们首先创建一个示例表:

% Create a sample table
col1 = {'ZMX01'; 'MX002'; 'US001'};
col2 = {5;7;3};
T = table(col1, col2);

T = 
     col1      col2
    _______    ____

    'ZMX01'    [5] 
    'MX002'    [7] 
    'US001'    [3] 

现在,MATLAB 提供了rowfun 函数以将任何函数应用于表中的每一行。默认情况下,您调用的函数必须能够处理表的 所有 列。 要将rowfun 仅应用于一列,您可以使用'InputVariables' 参数,该参数允许您指定列的编号(例如,第二列的2)或列的名称(例如'myColumnName' )。 然后,您可以将'OutputFormat' 设置为'uniform' 以获取数组而不是新表作为输出。

在您的情况下,您需要在 'col1' 列上使用 strfindstrfind 的返回值要么是一个空数组(如果未找到 'MX'),要么是找到 'MX' 的所有索引的数组。

% Apply rowfun
idx = rowfun(@(x)strfind(x,'MX'), T, 'InputVariables', 'col1', 'OutputFormat', 'uniform');

这个输出将是

idx = 
    [2]
    [1]
    []

3×1 元胞数组,'US001' 为空,其他两个输入都包含正值。要使用这些数据创建表的子集,我们可以执行以下操作:

% Create logical array, which is true for all rows to keep.
idx = ~cellfun(@isempty, idx);

% Save these rows and all columns of the table into a new table
R = T(idx,:);

最后,我们得到了结果表R

R = 
     col1      col2
    _______    ____

    'ZMX01'    [5] 
    'MX002'    [7] 

【讨论】:

  • rowfun 的开销在这里真的有必要吗?您获得与idx = strfind(T.col1, 'MX'); 相同的idx
  • @excaza 是的,strfind 确实是一样的,所以这里的开销并不是必需的。 rowfun 对于具有多行的更复杂的情况特别有用,或者直接使用结果创建新列。
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 2019-08-28
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2018-07-15
相关资源
最近更新 更多