【问题标题】:Matlab - Extracting rows with specfic column value from tableMatlab - 从表中提取具有特定列值的行
【发布时间】:2018-03-28 15:12:05
【问题描述】:

我试图弄清楚如果行的某个变量具有某个值,如何从表中提取行。我知道如何在 R 中做到这一点,但在 Matlab 中无法弄清楚。例如,假设这是我的桌子:

Var1    Var2    Var3
_____  _____   ______
 1.0    2.0   'class 1'
 1.1    2.1   'class 2'
 1.2    2.2   'class 3'
 1.3    2.3   'class 1'

我试图弄清楚如何获取 Var3 具有值“类 1”的所有行。具体来说,我想要这个:

Var1    Var2    Var3
_____  _____   ______
 1.0    2.0   'class 1'
 1.3    2.3   'class 1'

到目前为止,我已经尝试使用 this post 中概述的关键字参数,以及使用 matlab 行来尝试对所有内容进行排序。两者都没有奏效。

假设 T 是我的桌子。首先,我试过了

T(T.Var5 == 'class 1',:) 

但得到了错误:

Undefined operator '==' for input arguments of type 'cell'.

然后,我决定有点创意,发现您可以在 Matlab 文档中创建行名。所以我这样做了:

A = T{:,{1:2}};
B = T{:,{3}};
B = table2array(B);
A.Properties.RowNames = B;

但我得到了错误:

Duplicate row name: 'class 1'.

我在这里做错了吗?在 Matlab 中是否有一种简单的方法可以做到这一点?

感谢任何帮助。谢谢。

【问题讨论】:

    标签: matlab matlab-table


    【解决方案1】:

    您可以使用findgroups 对您的数据进行分组。

    例如:

    a = [1.0; 1.1; 1.2; 1.3];
    b = [2.0; 2.1; 2.2; 2.3];
    c = {'class 1'; 'class 2'; 'class 3'; 'class 1'};
    T = table(a, b, c);
    
    [groupidx, group] = findgroups(T.c);
    T_class1 = T(groupidx==1, :)
    

    返回:

    T_class1 =
    
      2×3 table
    
         a      b         c    
        ___    ___    _________
    
          1      2    'class 1'
        1.3    2.3    'class 1'
    

    findgroups 将返回每行的组索引,以及所有唯一行的可选输出。在我的示例中,我假设 'class 1' 是第一个输出,但您可以与 strcmp 进行显式比较以制定更强大的解决方案。

    说到strcmp,如果你正在寻找一个特定的字符串,你可以执行类似的索引操作。

    例如,你可以这样做:

    T_class1 = T(strcmp(T.c, 'class 1'), :)
    

    也返回:

    T_class1 =
    
      2×3 table
    
         a      b         c    
        ___    ___    _________
    
          1      2    'class 1'
        1.3    2.3    'class 1'
    

    findgroups 的优势在于它适合splitapply 工作流程,允许您对表的数据进行分组和执行选项。

    例如,我们可以在几行中按类找到 a 数据的均值:

    [groupidx, group] = findgroups(T.c);
    mean_a = splitapply(@mean, T.a, groupidx);
    outT = table(group, mean_a)
    

    这给了我们:

    outT =
    
      3×2 table
    
          group      mean_a
        _________    ______
    
        'class 1'    1.15  
        'class 2'     1.1  
        'class 3'     1.2  
    

    【讨论】:

    • T_class1 = T(strcmp(T.c, 'class 1'), :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2016-11-07
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多