我正在使用 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_之前 =
8×4 桌子
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
實際上,該表要長得多,并且包含更多欄位。給定 ID 的最新 DATE 可以不同。FIELD_ID 列包含欄位,它們各自的值在 VALUE 列中。
我想做的是以長格式取消堆疊此表,使每個 ID 有一行,欄位為列。我有一個條件,我只想取消堆疊包含 field 中最新值的行DATE。它應該如下所示:
T_after =
2×4 桌子
ID DATE f1 f2
_____ ____ __ __
{'a'} 2011 5 6
{'b'} 2012 7 8
uj5u.com熱心網友回復:
一個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'});
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/432373.html
上一篇:如何在matlab中將包含'?'的數字行的char陣列轉換為整數?
下一篇:如何在dBFS中繪制PSD?
