gpt4 book ai didi

matlab - 如果不是所有变量都相同,如何连接两个数据集?

转载 作者:太空宇宙 更新时间:2023-11-03 20:16:29 24 4
gpt4 key购买 nike

我有两个列数不同的数据集:

ds1:

A   B   C
1 2 3

ds2:

A   C   D
2 3 4

现在我想合并这两个数据集:

结果:

A   B   C   D
1 2 3 0
2 3 0 4

如您所见,如果变量名称不存在于两个数据集中,我只想添加 0、NaN 或空白。我尝试使用 catjoin,但我不知道该怎么做。有什么提示吗?

最佳答案

这是一种丑陋的方式 - 下面是一种更简洁的方式(稍后添加)。问题是,一旦您使用元胞数组(因为数据类型是混合的 - 列的字母,然后是数字),生活就会变得艰难。您可能可以通过创建一个结构来做得更好,其中列名和数据是两个单独的数组(见下文)......但现在这里是“一个解决方案”。通过在两个数据集中使用不同数量的行以及不同数量的列,我让生活变得更加有趣 - 只是为了确保不会破坏某些东西。

ds1 = {'a','bb','c';1,2,3};
ds2 = {'aa','c','d', 'e';2,3,4,5; 5,6,7,8};
cols = unique({ds1{1,:} ds2{1,:}});

ds3 = cols;
n1 = size(ds1,1) - 1;
%%
for ii = 1:size(ds1,2)
ci = find(cellfun(@(x) isequal(x, ds1{1,ii}), cols));
if numel(ci) > 0
for jj = 1:n1
ds3{1+jj,ci} = ds1{1+jj, ii};
end
end
end
n2 = size(ds2, 1) - 1;
for ii = 1:size(ds2,2)
ci = find(cellfun(@(x) isequal(x, ds2{1,ii}), cols));
if numel(ci) > 0
for jj = 1:n2
ds3{1+n1+jj,ci} = ds2{1+jj, ii};
end
end
end

生成的合并数组:

'a'   'aa'  'bb'   'c'    'd'   'e'
[1] [] [ 2] [3] [] []
[] [ 2] [] [3] [4] [5]
[] [ 5] [] [6] [7] [8]

这不是最优的,我敢肯定 - 但它可以满足您的要求...我讨厌循环执行此操作,但看不到解决方法。我希望其中一位“真正的 Matlab 专家”在看到这个时会呕吐,并受到激励给你一个聪明的答案。

编辑 我对此进行了更多思考,并提出了一个更有效的算法:

% assuming column headers and data are in two separate arrays
ds1headers = {'a','bb','c'};
ds1data = [1 2 3; 2 3 4];
ds2headers = {'aa','c','d', 'e'};
ds2data = [2 3 4 5; 3 4 5 6; 4 5 6 7];

% as before, find unique column headers:
cols = unique({ds1headers{:} ds2headers{:}});

% convert to column numbers:
ds1conv = cellfun(@(x)find(ismember(cols, x)), ds1headers);
ds2conv = cellfun(@(x)find(ismember(cols, x)), ds2headers);

% now conversion is easy:
n1 = size(ds1data,1);
n2 = size(ds2data,1);
ds3data = zeros(n1+n2, numel(cols));

ds3data(1:n1, ds1conv) = ds1data;
ds3data(n1+(1:n2), ds2conv) = ds2data;

disp(cols)
disp(ds3data)

结果是

'a'    'aa'    'bb'    'c'    'd'    'e'

1 0 2 3 0 0
2 0 3 4 0 0
0 2 0 3 4 5
0 3 0 4 5 6
0 4 0 5 6 7

看起来它可以解决问题 - 并且没有丑陋的循环......我现在认识到这看起来有点像下面@Magla 的解决方案(我发布更新时没有看到它,但它之前显然存在我最近的编辑)- 除了我还有一个用于列名的元胞数组,以及其他一些改进。

关于matlab - 如果不是所有变量都相同,如何连接两个数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17618727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com