如何根据 MATLAB 中另一个 table 中不同列之间的比较删除 table 数据?
How to remove table data based on comparison between different columns in another table in MATLAB?
我在 MATLAB 中有 2 个 tables - table A 和 table B,每个都有不同的维度(不同的行数和列数)。 table A 的第一列的日期和时间格式类似于 2018-11-01 12:00:00
(DateTime 数据格式)。
现在,在 Table B 中,第三列和第四列也包含日期和时间,格式类似于 2018-11-01 01:11:12:173000
。我想要实现的是从 Table A 中删除所有行(它们是数据实例),在这种情况下,Table A 的日期时间落在日期和时间之间的范围内Table B。(更准确地说,假设 Table B 在第一个 row/first 数据实例的第三列中有一个日期时间条目 2018-11-10 12:30:00:173
,在第四列中作为 2018-11-10 12:40:00:145
,我想从 Table A 中删除所有数据 entries/rows,如果 Table A 的日期时间列值落在 2018-11-10 12:30:00:173
的范围内2018-11-10 12:40:00:145
,例如)。这意味着基本上我将从 Table A.
中删除上述范围内的数据
为了解决这个问题,我首先想到的是使用 inner join()
,但是,从 Mathworks 社区指南中可以明显看出 innerjoin()
只匹配我指定的确切列值Key as,但在这种情况下,我会查看 table B 的 2 列中的一系列 DateTime 值,因此这可能不是最佳方法。为此目的使用 for loop
也可能有效,但会相当复杂和冗余,因为 table 中的大数据需要大量计算时间。在这方面的任何帮助将不胜感激。
我在 Mathworks 社区页面上收到了一些很好的问题答案,可以在 https://uk.mathworks.com/matlabcentral/answers/432509-how-to-remove-table-data-based-on-comparison-between-different-columns-in-another-table-in-matlab?s_tid=prof_contriblnk
找到答案
感谢 Guillaume 的回答(在上面提到的 Mathworks 社区页面 link 上回答),我把它放在这里以备将来帮助任何人:-
%inputs: TableA with a column named date, TableB with a column named datestart and dateend
%replace by actual table and variable names.
datetocheck = repmat(TableA.date, 1, height(TableB)); %replicate in as many columns as there are rows in B
datestart = repmat(TableB.datestart', height(TableA), 1); %tranpose and replicate in as many rows as in A
dateend = repmat(TableB.dateend', height(TableA), 1);
toremove = any(datetocheck >= datestart & datetocheck <= dateend, 2);
TableA(toremove, :) = [];
我在 MATLAB 中有 2 个 tables - table A 和 table B,每个都有不同的维度(不同的行数和列数)。 table A 的第一列的日期和时间格式类似于 2018-11-01 12:00:00
(DateTime 数据格式)。
现在,在 Table B 中,第三列和第四列也包含日期和时间,格式类似于 2018-11-01 01:11:12:173000
。我想要实现的是从 Table A 中删除所有行(它们是数据实例),在这种情况下,Table A 的日期时间落在日期和时间之间的范围内Table B。(更准确地说,假设 Table B 在第一个 row/first 数据实例的第三列中有一个日期时间条目 2018-11-10 12:30:00:173
,在第四列中作为 2018-11-10 12:40:00:145
,我想从 Table A 中删除所有数据 entries/rows,如果 Table A 的日期时间列值落在 2018-11-10 12:30:00:173
的范围内2018-11-10 12:40:00:145
,例如)。这意味着基本上我将从 Table A.
为了解决这个问题,我首先想到的是使用 inner join()
,但是,从 Mathworks 社区指南中可以明显看出 innerjoin()
只匹配我指定的确切列值Key as,但在这种情况下,我会查看 table B 的 2 列中的一系列 DateTime 值,因此这可能不是最佳方法。为此目的使用 for loop
也可能有效,但会相当复杂和冗余,因为 table 中的大数据需要大量计算时间。在这方面的任何帮助将不胜感激。
我在 Mathworks 社区页面上收到了一些很好的问题答案,可以在 https://uk.mathworks.com/matlabcentral/answers/432509-how-to-remove-table-data-based-on-comparison-between-different-columns-in-another-table-in-matlab?s_tid=prof_contriblnk
找到答案感谢 Guillaume 的回答(在上面提到的 Mathworks 社区页面 link 上回答),我把它放在这里以备将来帮助任何人:-
%inputs: TableA with a column named date, TableB with a column named datestart and dateend
%replace by actual table and variable names.
datetocheck = repmat(TableA.date, 1, height(TableB)); %replicate in as many columns as there are rows in B
datestart = repmat(TableB.datestart', height(TableA), 1); %tranpose and replicate in as many rows as in A
dateend = repmat(TableB.dateend', height(TableA), 1);
toremove = any(datetocheck >= datestart & datetocheck <= dateend, 2);
TableA(toremove, :) = [];