- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
设 A
和 B
是两个 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 ofB
.
(更准确地说,我想生成一个新表 C
,其中包含 A
的所有行,这些行“匹配”B
的一行。)
有没有一种有效的方法来做到这一点? (我试图在这里避免 for
-Loop Hell,或者任何依赖于知道的解决方案,比如说,关键因素的数量等,因为我想在对 A
和 B
不太了解的代码中使用它,直到运行时。)
我尝试了 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
这样的函数。
以下是我正在考虑的 A
和 B
表类型的示例。 (对于那些没有支持(相当新的)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/
我有两种结构,Header 和Session,它们都符合协议(protocol)TimelineItem。 我有一个 Array 由 TimelineItem 组成,如下所示: [Header1, S
这个问题在这里已经有了答案: Multiple assignment and evaluation order in Python (11 个答案) 关闭 6 年前。 我刚接触python所以想问你
我试图找到一种方法来在 R 中获取 A、A、A、A、B、B、B、B、B 的所有可能的唯一排列的列表。 组合最初被认为是获得解决方案的方法,因此组合的答案。 最佳答案 我认为这就是你所追求的。 @bil
我怎样才能将两个给定的向量混合成一个新的向量,它以交替的顺序保存它们的值。 (f [a a] [b b]) ; > [a b a b] 这是我想到的: (flatten (map vector [:a
这是我的第一个问题,我开始学习Python。之间有区别吗: a, b = b, a + b 和 a = b b = a + b 当您在下面的示例中编写它时,它会显示不同的结果。 def fib(n):
这个问题在这里已经有了答案: Why is there an injected class name? (1 个回答) 12 个月前关闭。 我不知道如何解释: namespace A { struct
我尝试了一些代码来交换 Java 中的两个整数,而不使用第三个变量,使用 XOR。 这是我尝试过的两个交换函数: package lang.numeric; public class SwapVars
假设类 B 扩展类 A,并且我想为 B 声明一个变量。什么更有效?为什么? B b或 A b . 最佳答案 您混淆了两个不同的概念。 class B extends A { } 意味着B 是 A .
我不确定这个问题的标题是什么,这也可能是一个重复的问题。所以请相应地指导。 我是 python 编程的新手。我有这个简单的代码来生成斐波那契数列。 1: def fibo(n): 2: a =
我在谷歌上搜索了有关 dynamic_cast 的内容,我发现显式地将基类对象转换为派生类指针可能是不安全的。但是当我运行一些示例代码来检查它时,我没有收到任何错误。请在下面找到我的代码: class
这个问题在这里已经有了答案: What is this weird colon-member (" : ") syntax in the constructor? (14 个答案) 关闭 8 年前。
在不重现产生非整数值的表达式的情况下实现以下目标的惯用方法是什么(在我的真实情况下,该值是在我不想重现的冗长查询之后计算为百分比的): SELECT * FROM SomeTable WHERE 1/
在析构中,这两个代码的结果确实不同。我不确定为什么。 提示说 const [b,a] = [a,b] 将导致 a,b 的值为 undefined (从左到右的简单分配规则)。我不明白为什么会这样。 l
C++ Templates - The Complete Guide, 2nd Edition介绍max模板: template T max (T a, T b) { // if b < a th
我最近开始学习代码(Java),并根据第 15.17.3 节在 Oracle 网站上查找了模运算符。以下链接: http://docs.oracle.com/javase/specs/jls/se8/
无法理解以下行为。 d1 := &data{1}; 的区别d1 和 d2 := 数据{1}; &d1。两者都是指针,对吧?但他们的行为不同。这里发生了什么 package main import "f
这个问题在这里已经有了答案: How to make loop infinite with "x = y && x != y"? (4 个回答) How can i define variables
在我的程序中,当我调试我的代码时,它似乎在我生成的代码中的某处 X1=['[a,a,a]','[b,b,b]'] 还有我生成的其他地方 X2=[[a,a,a],[b,b,b]] 当我想添加这两个列表然
我试图使用递归将两个整数相乘,并意外编写了这段代码: //the original version int multiply(int a, int b) { if ( !b ) retu
我有一个列表中数字之间所有可能的操作组合: list = ['2','7','8'] 7+8*2 8+7*2 2*8+7 2+8*7 2-8*7 8-2/7 etc 我想知道是否可以说像 ('7*2+
我是一名优秀的程序员,十分优秀!