Matlab - 从 table 中提取具有特定列值的行
Matlab - Extracting rows with specfic column value from table
我想弄清楚如果某行的某个变量具有某个值,如何从 table 中提取行。我知道如何在 R 中执行此操作,但无法在 Matlab 中弄清楚。例如,假设这是我的 table:
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'
到目前为止,我已经尝试使用 this post 中概述的关键字参数,以及使用 matlab 行来尝试对所有内容进行排序。都没有用。
假设 T 是我的 table。首先,我尝试了
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 中有没有简单的方法来做到这一点?
感谢任何帮助。谢谢。
您可以使用 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, :)
哪个 returns:
T_class1 =
2×3 table
a b c
___ ___ _________
1 2 'class 1'
1.3 2.3 'class 1'
findgroups
将 return 每行的组索引,以及所有唯一行的可选输出。在我的示例中,我假设 'class 1'
是第一个输出,但您可以与 strcmp
进行显式比较以制定更可靠的解决方案。
说到 strcmp
,如果您要查找特定字符串,可以执行类似的索引操作。
例如,您可以这样做:
T_class1 = T(strcmp(T.c, 'class 1'), :)
其中还有 returns:
T_class1 =
2×3 table
a b c
___ ___ _________
1 2 'class 1'
1.3 2.3 'class 1'
findgroups
的优势在于它适合 splitapply
工作流程,允许您对 table 的数据进行分组和执行选项。
例如,我们可以通过 class 在几行中找到我们 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
我想弄清楚如果某行的某个变量具有某个值,如何从 table 中提取行。我知道如何在 R 中执行此操作,但无法在 Matlab 中弄清楚。例如,假设这是我的 table:
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'
到目前为止,我已经尝试使用 this post 中概述的关键字参数,以及使用 matlab 行来尝试对所有内容进行排序。都没有用。
假设 T 是我的 table。首先,我尝试了
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 中有没有简单的方法来做到这一点?
感谢任何帮助。谢谢。
您可以使用 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, :)
哪个 returns:
T_class1 =
2×3 table
a b c
___ ___ _________
1 2 'class 1'
1.3 2.3 'class 1'
findgroups
将 return 每行的组索引,以及所有唯一行的可选输出。在我的示例中,我假设 'class 1'
是第一个输出,但您可以与 strcmp
进行显式比较以制定更可靠的解决方案。
说到 strcmp
,如果您要查找特定字符串,可以执行类似的索引操作。
例如,您可以这样做:
T_class1 = T(strcmp(T.c, 'class 1'), :)
其中还有 returns:
T_class1 =
2×3 table
a b c
___ ___ _________
1 2 'class 1'
1.3 2.3 'class 1'
findgroups
的优势在于它适合 splitapply
工作流程,允许您对 table 的数据进行分组和执行选项。
例如,我们可以通过 class 在几行中找到我们 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