gpt4 book ai didi

matlab - 如何获取与表(或数据集)对象 B 的某行匹配的表(或数据集)对象 A 的所有行?

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

AB 是两个 table(或 dataset)对象,它们具有一些共同的因子变量 K1, K2, ..., Kn。我将这些 n 个因素称为关键因素。另外,我会说一行 A 和一行 B 匹配 当且仅当它们在这些关键因素上匹配,即当且仅当 A.K1 == B.K1 & A.K2 == B.K2 & ... & A.Kn == B.Kn

(我在本文末尾给出了上面的示例和代码。)

I'm looking for an efficient way to extract all the rows of A that "match" one1 row of B.

(更准确地说,我想生成一个新表 C,其中包含 A 的所有行,这些行“匹配”B 的一行。)


有没有一种有效的方法来做到这一点? (我试图在这里避免 for -Loop Hell,或者任何依赖于知道的解决方案,比如说,关键因素的数量等,因为我想在对 AB 不太了解的代码中使用它,直到运行时。)

我尝试了 intersect(A, B) ,但失败并出现错误:

>> keyfactors = intersect(A.Properties.VarNames, B.Properties.VarNames);
>> intersect(A, B, keyfactors)
Error using table/intersect (line 41)
A and B must contain the same variables.

我能想出的唯一其他策略(虽然我还不知道如何实现它)是以某种方式合成基于编码在 B 中的信息的动态函数.例如,给定一个这样的索引表 B

B = cell2table({
'even', 'red', 'diamonds';
'odd', 'yellow', 'spades';
'odd', 'green', 'hearts'
}, 'VariableNames', ...
{'Parity', 'TrafficLight', 'Suit'});

...以某种方式以编程方式生成类似

的函数
fn = @(c) any([all([strcmp(c(:, 1), 'even'), ...
strcmp(c(:, 2), 'red'), ...
strcmp(c(:, 3), 'diamonds')], 2), ...
all([strcmp(c(:, 1), 'odd'), ...
strcmp(c(:, 2), 'yellow'), ...
strcmp(c(:, 3), 'spades')], 2), ...
all([strcmp(c(:, 1), 'odd'), ...
strcmp(c(:, 2), 'green'), ...
strcmp(c(:, 3), 'hearts')], 2)], 2);

...然后可以在这样的表达式中使用:

Ac = table2cell(A);
C = cell2table(Ac(fn(Ac), :), ...
'VariableNames', B.Properties.VariableNames);

不幸的是,我无法弄清楚如何在不求助于(强烈反对)使用 fn 的情况下以编程方式合成像上面的 eval 这样的函数。


以下是我正在考虑的 AB 表类型的示例。 (对于那些没有支持(相当新的)table 对象的 MATLAB 版本的人来说,如果将字符串“table”和“VariableNames”替换为字符串“dataset”和“VarNames”,下面的代码应该可以工作,分别。)

% "data" table
A = cell2table({
'even', 'red', 'spades', 38, 0.9837;
'even', 'red', 'hearts', 19, 0.5695;
'even', 'red', 'diamonds', 89, 0.2629;
'even', 'red', 'diamonds', 98, 0.3578;
'even', 'red', 'diamonds', 92, 0.2596;
'even', 'red', 'diamonds', 69, 0.5751;
'even', 'red', 'diamonds', 77, 0.6318;
'even', 'yellow', 'clubs', 22, 0.6917;
'even', 'green', 'spades', 35, 0.6674;
'even', 'green', 'hearts', 67, 0.7896;
'even', 'green', 'hearts', 49, 0.5025;
'even', 'green', 'hearts', 64, 0.5318;
'odd', 'red', 'spades', 22, 0.5587;
'odd', 'red', 'hearts', 51, 0.9122;
'odd', 'red', 'diamonds', 74, 0.3343;
'odd', 'red', 'diamonds', 69, 0.2911;
'odd', 'yellow', 'spades', 33, 0.2653;
'odd', 'yellow', 'spades', 38, 0.2549;
'odd', 'yellow', 'diamonds', 1, 0.2064;
'odd', 'yellow', 'diamonds', 25, 0.8257;
'odd', 'green', 'spades', 64, 0.4348;
'odd', 'green', 'hearts', 59, 0.8644;
'odd', 'green', 'hearts', 4, 0.6374;
'odd', 'green', 'hearts', 11, 0.3354
}, 'VariableNames', ...
{'Parity', 'TrafficLight', 'Suit', 'order', 'prevalence'});

% "indexing" table
B = cell2table({
'i', 'even', 'red', 'diamonds';
'ii', 'odd', 'yellow', 'spades';
'iii', 'odd', 'green', 'hearts'
}, 'VariableNames', ...
[{'class'} A.Properties.VariableNames(1:3)]);

keyfactors = intersect(B.Properties.VariableNames, ...
A.Properties.VariableNames, ...
'stable');

% this fails:
% intersect(A, B, keyfactors);

% desired subtable would look like this one
C = cell2table({
'even', 'red', 'diamonds', 89, 0.2629;
'even', 'red', 'diamonds', 98, 0.3578;
'even', 'red', 'diamonds', 92, 0.2596;
'even', 'red', 'diamonds', 69, 0.5751;
'even', 'red', 'diamonds', 77, 0.6318;
'odd', 'yellow', 'spades', 33, 0.2653;
'odd', 'yellow', 'spades', 38, 0.2549;
'odd', 'green', 'hearts', 59, 0.8644;
'odd', 'green', 'hearts', 4, 0.6374;
'odd', 'green', 'hearts', 11, 0.3354
}, 'VariableNames', ...
{'Parity', 'TrafficLight', 'Suit', 'order', 'prevalence'});

1 可以有把握地假设,在 B 中,关键因素的任何值组合(也称为“水平”)最多一次出现。对于 A 这通常是正确的。实际上,A 将包含真实数据,而 B 将是“合成的”(即专门为此处描述的操作构建),并且与 A 相比,变量和行数少。因此,人们可能会将 B 视为 A 的“索引表”。

最佳答案

这会返回你想要的,但我不知道它是否普遍有效,所以你需要测试:

[~,iB,iA] = intersect(B.Properties.VariableNames, ...
A.Properties.VariableNames, ...
'stable');
C = A(ismember(A(:,iA),intersect(A(:,iA),B(:,iB),'stable')),:)

部分问题是 table/intersect 仅在行重复时返回第一次出现的地方。我使用 table/ismember 生成逻辑索引来解决这个问题。

关于matlab - 如何获取与表(或数据集)对象 B 的某行匹配的表(或数据集)对象 A 的所有行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21537734/

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