如何在一组分组变量中找到最后一个元素?

时间:2015-02-11 17:10:20

标签: matlab

我有一个150x2矩阵,其中第一列包含可以考虑的数字'分组变量'第二列包含与这些分组变量相关的值。所以一个小的12x2版本看起来像这样

 200741 5441
 200741 5524
 200741 5428
 200742 5670
 200742 5668
 200742 5559
 200742 5215
 200743 5184
 200743 5473
 200743 5496
 200743 5568
 200743 5702

我想找到与每个分组变量关联的值的最后一个值。因此,上面的例子将产生5428的最后一个元素(对于变量200741),最后一个元素为5215(对于变量200742)& 5702的最后一个元素(用于分组变量200743)。在coumn1中找到分组变量的唯一值后,如何获取column2中与每个分组变量对应的最后一个元素?怎么可以在Matlab中完成?

4 个答案:

答案 0 :(得分:4)

如果第一列已排序且包含正整数,则可以使用accumarray(无可否认地延伸一点):

result = nonzeros(accumarray(A(:,1), A(:,2), [], @(x) x(end), 0, true));

注意:

  • 排序要求源于这样一个事实:根据documentation

      

    如果subs中的下标没有根据其线性索引进行排序,那么accumarray在将fun传递给@(x) x(end)时可能并不总是保留val中数据的顺序/ p>

    所以accumarray并不总是提供 last 元素。

  • 如果分组值很大(如示例所示),则使用true(第五个参数{{1}})的稀疏版本。

答案 1 :(得分:3)

这可能是一种方法,假设A作为输入数组 -

%// Sort the input matrix based on the column -1 values, 
%// just for cases when the "grouping variables" are not already sorted
A = sortrows(A,1)

%// Use diff to find out the row indices where "groups" switch
%// to give us the last row indices for each "grouping", which
%// could be used to index into second column of A for final output
out = A([diff(A(:,1))~=0 ; true],2)

答案 2 :(得分:3)

假设矩阵按分组编号排序,如示例所示,要获得布尔索引,您可以执行以下操作: 给定矩阵为a

I=a(1:end-1, 1) ~= a(2:end, 1)

它将在与最后一个"分组对应的索引上存储布尔值"数字,除了最后一个。 因此,要获取所需的行,只需执行a(I, :)。并且不要忘记最后的结果。 或者,作为一个单行:

[a( a(1:end-1, 1) ~= a(2:end, 1), : ); a(end, :)]

答案 3 :(得分:3)

您可以使用unique为您提供数字第一次或最后一次出现的位置;根据版本的不同,您可能需要使用legacy选项以确保它返回last索引:

[B,ind,~] = unique(A(:,1),'last','legacy');
out = A(ind,2);