在Matlab中分组,找到与SQL相似的最小值

在Matlab中分组,找到与SQL相似的最小值,sql,matlab,group-by,Sql,Matlab,Group By,我有一个包含a、b、c和d列的数据集 我想将数据集按a,b进行分组,然后找到c,这样每个组的d都是最小的 我可以使用“grpstats”进行“分组”,如下所示: grpstats(M,[M(:,1)M(:,2)],{'min'}) 我不知道如何找到M(:,3)的值,它导致了d中的min 在SQL中,我假设我们使用嵌套查询并使用主键。我如何在Matlab中解决它 以下是一个例子: >> M =[4,1,7,0.3; 2,1,8,0.4; 2,1,9,0.2; 4,2,1,0.2; 2,

我有一个包含a、b、c和d列的数据集 我想将数据集按a,b进行分组,然后找到c,这样每个组的d都是最小的 我可以使用“grpstats”进行“分组”,如下所示:

grpstats(M,[M(:,1)M(:,2)],{'min'})

我不知道如何找到M(:,3)的值,它导致了d中的min

在SQL中,我假设我们使用嵌套查询并使用主键。我如何在Matlab中解决它

以下是一个例子:

>> M =[4,1,7,0.3;
2,1,8,0.4;
2,1,9,0.2;
4,2,1,0.2;
2,2,2,0.6;
4,2,3,0.1;
4,3,5,0.8;
5,3,6,0.2;
4,3,4,0.5;]

>> grpstats(M,[M(:,1) M(:,2)],'min')
ans =

2.0000    1.0000    8.0000    0.2000
2.0000    2.0000    2.0000    0.6000
4.0000    1.0000    7.0000    0.3000
4.0000    2.0000    1.0000    0.1000
4.0000    3.0000    4.0000    0.5000
5.0000    3.0000    6.0000    0.2000
但是M(1,3)和M(4,3)是错误的。我要寻找的正确答案是:

2.0000    1.0000    9.0000    0.2000
2.0000    2.0000    2.0000    0.6000
4.0000    1.0000    7.0000    0.3000
4.0000    2.0000    3.0000    0.1000
4.0000    3.0000    4.0000    0.5000
5.0000    3.0000    6.0000    0.2000
总之,我不想要第三列的最小值;但我想要它的值对应第四列的最小值

temp = grpstats(M(:, [1 2 4 3]),[M(:,1) M(:,2) ],{'min'});
result = temp(:, [1 2 4 3]);
我会按照你的要求去做。如果没有,请在评论中解释,我们可以找出答案

如果我正确理解文档,即使

temp = grpstats(M(:, [1 2 4 3]), [1 2], {'min'});
result = temp(:, [1 2 4 3]);

应该可以工作(给出列号而不是列的全部内容)…现在无法测试,因此无法对此进行担保。

grpstats
无法做到这一点,而MATLAB并没有让它像您希望的那样简单

有时暴力是最好的,即使它感觉不像是伟大的MATLAB风格:

[b,m,n]=unique(M(:,1:2),'rows');
for i =1:numel(m)
    idx=find(n==i);
    [~,subidx] = min(M(idx,4));
    a(i,:) = M(idx(subidx),3:4);
end

>> [b,a]
ans =
        2            1            9          0.2
        2            2            2          0.6
        4            1            7          0.3
        4            2            3          0.1
        4            3            4          0.5
        5            3            6          0.2

你能显示(简要)样本数据,你得到的输出吗?我不确定我是否理解你的问题。你所说的“导致最小值为d的M(:,3)的值”是什么意思?当然。我编辑了问题内容。不,两者都返回相同的错误答案。如果你在Matlab中运行其中任何一个,你将看到行M(:,[1 2])=[2 1]这是答案的第一行,它返回M(:,3)=8。而如果查看初始数据集,M(:,[1 2 4])=0.2的值对应于M(:,3)=9,而不是8。它没有保留初始行,它确实会分别找到第3列和第4列的最小值。我只需要第4列的最小值和第3列中的相应值。我必须在早上访问Matlab时尝试此操作,以测试一些备选方案…抱歉,我现在不能这样做。如果grpstats中的“min”(M(:,),[1 2 4 3],[1 2],{'min'})将返回索引而不是值,这样就更容易解决问题。感谢这项工作。我曾考虑使用循环来执行此操作,但尝试以更有效的方式执行。是的,我尝试了一段时间使用MATLAB方式执行此操作,但放弃了。对于这样的小数据集,它不会产生太大的影响。如果swer适用于您,请使用左侧的勾选按钮将其标记为已接受。这是一个示例数据集;真实的数据集要大得多。无论如何,谢谢