matlab 不按键排序的时间表外联接

628mspwn  于 2022-11-24  发布在  Matlab
关注(0)|答案(1)|浏览(155)

我试图找到一种方法来执行包含相同变量的两个时间表的外部联接,同时不基于值对键的合并行进行排序。我希望优先选择table1(高质量数据)中的值,而不是table2(低质量数据)中的值,因为这两个表中存在相同的时间样本。
我能找到的最接近的是Merge tables Without sorting on Keys,但这对我的情况不起作用,因为我必须按时间对时间表排序,以便使用重定时,我需要重定时来压缩重复的时间样本。
例如:

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来获得所有可用时间样本的一组值,在它们重叠的地方首选table1:

retime(mergedTable, unique(mergedTable.Time), 'firstvalues')

       Time        A
    ___________    _

    01-Jan-2000    2
    01-Jan-2001    5
    01-Jan-2002    3

也许有比外部连接和重定时更好的方法?

k10s72fa

k10s72fa1#

您可以使用表数据质量“排名”向两个源表中添加一列。在联接中包括此列。然后,在联接之后,您可以按质量排名和时间重新排序,最终得到所需的排序。

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

如果您想在以后删除帮助器列,这很容易

mergedTable.Quality = [];

相关问题