我试图找到一种方法来执行包含相同变量的两个时间表的外连接,而不是根据值排序合并的键行。我想优先考虑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 = [];