时间表外连接,不按键排序



我试图找到一种方法来执行包含相同变量的两个时间表的外连接,而不是根据值排序合并的键行。我想优先考虑table1(高质量数据)中的值,而不是table2(低质量数据),其中两个表中存在相同的时间样本。

我能找到的最接近的是合并表,没有对键进行排序,但这并不适用于我的情况,因为我必须按时间排序时间表,以便使用retime,我需要压缩重复的时间样本。

table1 = array2timetable([2;5], 'RowTimes', datetime(2000:2001,1,1), 'VariableNames', {'A'})
table2 = array2timetable([1;3], 'RowTimes', datetime(2001:2002,1,1), 'VariableNames', {'A'})
mergedTable = outerjoin(table1, table2, 'MergeKeys', true, 'Keys', {'Time', 'A'})
table1 =
2×1 timetable
Time        A
___________    _
01-Jan-2000    2
01-Jan-2001    5

table2 =
2×1 timetable
Time        A
___________    _
01-Jan-2001    1
01-Jan-2002    3

mergedTable =
4×1 timetable
Time        A
___________    _
01-Jan-2000    2
01-Jan-2001    1
01-Jan-2001    5
01-Jan-2002    3

我想要的输出是:

Time        A
___________    _
01-Jan-2000    2 <- only in table1
01-Jan-2001    5 <- table1 row first, regardless of value
01-Jan-2001    1 <- table2 row second, regardless of value
01-Jan-2002    3 <- only in table2

这将允许我使用retime来获得所有可用时间样本的一组值,更喜欢它们重叠的表1:

retime(mergedTable, unique(mergedTable.Time), 'firstvalues')
Time        A
___________    _
01-Jan-2000    2
01-Jan-2001    5
01-Jan-2002    3

也许有比outerjoin和retime更好的方法?

可以在两个源表中添加一个列,其中包含表数据质量"排名"。在联接中包括此列。然后,在加入之后,您可以根据质量排名和时间重新排序,最后您将得到您想要的排序。

table1 = array2timetable([2;5], 'RowTimes', datetime(2000:2001,1,1), 'VariableNames', {'A'})
table2 = array2timetable([1;3], 'RowTimes', datetime(2001:2002,1,1), 'VariableNames', {'A'})
% Assign quality score to the input tables
table1.Quality(:) = 1;
table2.Quality(:) = 2;
mergedTable = outerjoin(table1, table2, 'MergeKeys', true, 'Keys', {'Time', 'A', 'Quality'})
% Re-sort the table to prioritise higher quality data
mergedTable = sortrows( mergedTable, {'Quality', 'Time'} )

输出:

mergedTable =
4×2 timetable
Time       A    Quality
___________    _    _______
01-Jan-2000    2    1      
01-Jan-2001    5    1      
01-Jan-2001    1    2      
01-Jan-2002    3    2   

如果您想在之后删除helper列,那很容易

mergedTable.Quality = [];

最新更新