两个表的全外连接
Full outer join of two tables
我有两个 table,比如说,price(5 行,1 列)和 pricedate(6 行,1 列),它们没有任何共同点。我想获得全外连接,这样我的新 table ABC 就有 30 行,基本上 pricedate 中的每一行都有所有价格。
怎么做?我可以使用完全外部联接或其他方式吗?
我的回答包括两种情况:
P
(价格) 和 PD
(价格) 是 表格
P
(价格) 和 PD
(定价) 是 数组
代码如下:
% generate some sample data
price = [1;2;3;4;5];
pricedate1 = [11;12;13;14;15;16];
pricedate2 = pricedate1+10;
pricedate3 = pricedate2+10;
% create sample table
P = table(price);
PD = table(pricedate1,pricedate2,pricedate3);
% this is the code if P and PD are tables
TMP = repmat(P{:,1},1,size(PD,1))';
T = [repmat(PD,size(P,1),1),table(TMP(:),'VariableNames',{'price'})]
% create sample arrays
P = price;
PD = [pricedate1,pricedate2,pricedate3];
% this is the code if P and PD are arrays
TMP = repmat(P,1,size(PD,1))'
T = [repmat(PD,size(P,1),1), TMP(:)]
可以将其写在单行中以消除TMP
变量。
对于table
类型的数据:
T = [repmat(PD,size(P,1),1),table(subsref(repmat(P{:,1},1,size(PD,1))',struct('type','()','subs',{{':'}})),'VariableNames',{'price'})]
对于array
类型的数据:
T = [repmat(PD,size(P,1),1),subsref(repmat(P,1,size(PD,1))',struct('type','()','subs',{{':'}}))];
我承认,单行看起来很神秘。
由于看起来您正在尝试做笛卡尔积,我建议使用 FileExchange 中的 allcomb 函数,http://www.mathworks.com/matlabcentral/fileexchange/10064-allcomb
由于您的数据也在 (matlab) 表中(希望如此),您可以:
function Tallcomb = allcomb_2tables(T1, T2)
%USe allcomb to create the cartesian product of the indexes
idxAB = allcomb(1:height(T1),1:height(T2));
% Now horzcat the multi-broadcasted tables:
Tallcomb = horzcat(T1(idxAB(:,1),:), T2(idxAB(:,2),:) );
end
我有两个 table,比如说,price(5 行,1 列)和 pricedate(6 行,1 列),它们没有任何共同点。我想获得全外连接,这样我的新 table ABC 就有 30 行,基本上 pricedate 中的每一行都有所有价格。
怎么做?我可以使用完全外部联接或其他方式吗?
我的回答包括两种情况:
P
(价格) 和PD
(价格) 是 表格P
(价格) 和PD
(定价) 是 数组
代码如下:
% generate some sample data
price = [1;2;3;4;5];
pricedate1 = [11;12;13;14;15;16];
pricedate2 = pricedate1+10;
pricedate3 = pricedate2+10;
% create sample table
P = table(price);
PD = table(pricedate1,pricedate2,pricedate3);
% this is the code if P and PD are tables
TMP = repmat(P{:,1},1,size(PD,1))';
T = [repmat(PD,size(P,1),1),table(TMP(:),'VariableNames',{'price'})]
% create sample arrays
P = price;
PD = [pricedate1,pricedate2,pricedate3];
% this is the code if P and PD are arrays
TMP = repmat(P,1,size(PD,1))'
T = [repmat(PD,size(P,1),1), TMP(:)]
可以将其写在单行中以消除TMP
变量。
对于table
类型的数据:
T = [repmat(PD,size(P,1),1),table(subsref(repmat(P{:,1},1,size(PD,1))',struct('type','()','subs',{{':'}})),'VariableNames',{'price'})]
对于array
类型的数据:
T = [repmat(PD,size(P,1),1),subsref(repmat(P,1,size(PD,1))',struct('type','()','subs',{{':'}}))];
我承认,单行看起来很神秘。
由于看起来您正在尝试做笛卡尔积,我建议使用 FileExchange 中的 allcomb 函数,http://www.mathworks.com/matlabcentral/fileexchange/10064-allcomb
由于您的数据也在 (matlab) 表中(希望如此),您可以:
function Tallcomb = allcomb_2tables(T1, T2)
%USe allcomb to create the cartesian product of the indexes
idxAB = allcomb(1:height(T1),1:height(T2));
% Now horzcat the multi-broadcasted tables:
Tallcomb = horzcat(T1(idxAB(:,1),:), T2(idxAB(:,2),:) );
end