在MATLAB中从数据集中提取唯一记录

时间:2012-06-18 13:45:20

标签: matlab dataset record unique-key

这是一个不太难的问题,但是因为我还在学习MATLAB,我不得不佩服我有点挣扎。好吧,我们假设我们有两个数据集:

Input1 = [
Date;X1;X2;X3
2007-06-19;2;1;3
2007-06-22;1;2;3
2007-06-01;1;2;3
2007-06-18;1;2;3
2007-06-19;1;2;3
2007-06-20;1;2;3
2007-06-25;1;2;3
]

Input2 = [
Date;X1;X2;X3
2007-06-22;1;2;3
2007-06-19;1;2;3
2007-06-25;2;1;3
2007-06-01;1;2;3
2007-06-15;1;2;3
2007-06-18;1;2;3
2007-06-21;1;2;3
2007-06-25;1;2;3
]

Output1 = [
]

Output2 = [
]

我想做的是: - 根据第一列(最早放置日期的位置)分别对每个列进行排序。 - 根据第一列分别删除每个文件中的重复项。 - 当且仅当它们的密钥存在于这两个数据集中时,保留两条线(每个数据集一条线)。 - 进行最后检查以确保两个列表上的日期元素逐一相同。

eualin。

3 个答案:

答案 0 :(得分:3)

为了让您入门,在真正释放Matlab的强大功能之前,您需要稍微清理输入数据。

首先,丢失'列标题',Date;X1;X2;X3。 Matlab数组是数字的,甚至Matlab字符数组也是数字。

其次,只在每一行的末尾放置分号;就Matlab数组而言,一个分号是一行的结尾,所以你的表有可能成为列向量。使用当前有分号的空格或逗号,并在每行的末尾加上一个分号。

第三,Matlab数组是数字的,像2007-06-22这样的数字不是数字。正如你所写的那样,Matlab也不会将其识别为字符串。如果它确实将它识别为字符串,它会对输入进行barf,因为它不是全数字。

您可以使用单元格数组或结构,但将输入数组转换为数字可能更容易。例如,评估以下表达式:

Input1 = [
datenum(datevec('2007-06-19')),2,1,3;
datenum(datevec('2007-06-22')),1,2,3;
datenum(datevec('2007-06-01')),1,2,3;
datenum(datevec('2007-06-18')),1,2,3;
datenum(datevec('2007-06-19')),1,2,3;
datenum(datevec('2007-06-20')),1,2,3;
datenum(datevec('2007-06-25')),1,2,3;
]

将为您提供一个很好的数字数组,正如Dan已经建议的那样。 datenumdatevec是Matlab内置的函数。

答案 1 :(得分:2)

为了让您入门,一个没有重复的排序列表为每个执行此操作:

% find the unique values for the first column
[~, I] = unique(Input1(:,1));
% extract the records for each unique value in the first column (sorted)
SortedAndUnique = Input1(I,:);

我相信你会解决剩下的问题

答案 2 :(得分:1)

一些提示:

  • 您可以使用datenum('2007-06-22','yyyy-mm-dd')将日期表示为数字
  • unique()正如Dan的回答中提到的那样
  • intersect()查找Input1和Input2
  • 中的键