1

我试图弄清楚如果行的某个变量具有某个值,如何从表中提取行。我知道如何在 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 值为“class 1”的所有行。具体来说,我想要这个:

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

到目前为止,我已经尝试使用本文中概述的关键字参数,以及使用 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 中是否有一种简单的方法可以做到这一点?

任何帮助表示赞赏。谢谢。

4

1 回答 1

5

您可以使用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  
于 2017-10-17T02:45:12.133 回答