有 2 个条件的拆堆

Unstacking with 2 conditions

我正在使用 MATLAB 2021b,我有以下数据:

 ID = {'a','a','a','a','b','b','b','b'}';
 DATE = [2010,2010,2011,2011,2011,2011,2012,2012]';
 FIELD_ID = {'f1','f2','f1','f2','f1','f2','f1','f2'}';
 VALUE = [1,2,5,6,1,1,7,8]';
 T_before = table(ID,DATE,FIELD_ID,VALUE);

T_before =

8×4 table

 ID      DATE    FIELD_ID    VALUE
_____    ____    ________    _____

{'a'}    2010     {'f1'}       1  
{'a'}    2010     {'f2'}       2  
{'a'}    2011     {'f1'}       5  
{'a'}    2011     {'f2'}       6  
{'b'}    2011     {'f1'}       1  
{'b'}    2011     {'f2'}       1  
{'b'}    2012     {'f1'}       7  
{'b'}    2012     {'f2'}       8 

实际上 table 更长并且包含更多字段。给定 ID 的最新 DATE 可能不同。 FIELD_ID 列包含字段,它们各自的值在 VALUE 列中。

我想做的是以长格式取消堆叠此 table,使每个 ID 一行,字段作为列。我有一个条件,我只想拆开字段 DATE 中包含最新值的行。它应该如下所示:

T_after =

2×4 table

 ID      DATE    f1    f2
_____    ____    __    __

{'a'}    2011    5     6 
{'b'}    2012    7     8 

一个 for 循环可以快速完成此操作。

ID = {'a','a','a','a','b','b','b','b'}';
DATE = [2010,2010,2011,2011,2011,2011,2012,2012]';
FIELD_ID = {'f1','f2','f1','f2','f1','f2','f1','f2'}';
VALUE = [1,2,5,6,1,1,7,8]';
T_before = table(ID,DATE,FIELD_ID,VALUE);

% get unique IDs
id_unique = unique(ID);

n = numel(id_unique);
f1 = cell(1,n);
f2 = f1;
dates = f1;

for i = 1:n
    %filter DATE by unique ID, then get the latest date
    filter_id = ismember(ID, id_unique{i});
    date_filtered = DATE(filter_id);
    dates{i} = max(date_filtered);
    
    %filter FIELD_ID and VALUE by unique ID and dates
    filter_date = DATE == dates{i};
    filter = filter_id & filter_date;
    field_id_filtered = FIELD_ID(filter);
    value_filtered = VALUE(filter);
    
    %find F1 and F2
    if strcmp(field_id_filtered{1}, 'f1')
        f1{i} = value_filtered(1);
        f2{i} = value_filtered(2);
    else
        f1{i} = value_filtered(2);
        f2{i} = value_filtered(1);
    end
end

%make the final table
T = table(id_unique(:),dates(:),f1(:),f2(:), 'VariableNames',{'ID','DATE','f1','f2'});