Unique changing order(unique output values are reshuffled)

6 ビュー (過去 30 日間)
shaz
shaz 2012 年 12 月 18 日
コメント済み: Stephen23 2018 年 1 月 17 日
i have cell array with data like '2/6/2009','2/6/2009','2/6/2009','2/6/2009','2/7/2009',,'2/7/2009','2/7/2009','2/8/2009','2/8/2009','2/8/2009'
if i make use of unique to get only unique values the order is getting reshuffled
getting output like : '2/8/2009','2/6/2009','2/7/2009'
Desired output format: '2/6/2009','2/7/2009','2/8/2009'
  1 件のコメント
Stephen23
Stephen23 2018 年 1 月 17 日
Simply using my FEX submission natsort:
>> C = {'2/6/2009','2/6/2009','2/6/2009','2/6/2009','2/7/2009','2/7/2009','2/7/2009','2/8/2009','2/8/2009','2/8/2009'};
>> D = natsort(unique(C));
>> D{:}
ans = 2/6/2009
ans = 2/7/2009
ans = 2/8/2009
But the best solution is to change the date format for an ISO 8601 date format, which sort correctly into chronological order when you do a character sort. Once you start using ISO 8601 date formats you simply avoid all of these trivial problems.

サインインしてコメントする。

採用された回答

Muruganandham Subramanian
Muruganandham Subramanian 2012 年 12 月 18 日
b={'2/6/2099','2/6/2099','2/6/2099','2/6/2099','2/7/2099','2/7/2099', '2/7/2099','2/8/2099','2/8/2099','2/8/2099','2/10/2099','2/10/2099', '2/12/2099'};
c=datevec(b);
c(:,4:6)=[];
c(:,4)=c(:,1);
c(:,1)=[];
d=num2str(c);
d=cellstr(d);
d=unique(d)
Check this above code. But it's not effective way to do..here In unique(), it's not chosing in random way, it considers the data of first,which is sorted minimum(i.e. '10' is first than '6').
  4 件のコメント
Andrei Bobrov
Andrei Bobrov 2012 年 12 月 19 日
M = datevec(b,'mm/dd/yyyy');
[Muq, ii] = unique(M,'rows','first');
out = b(sort(ii));
shaz
shaz 2012 年 12 月 31 日
thanks a lot

サインインしてコメントする。

その他の回答 (4 件)

Muruganandham Subramanian
Muruganandham Subramanian 2012 年 12 月 18 日
編集済み: Muruganandham Subramanian 2012 年 12 月 18 日
>>b={'2/6/2009','2/6/2009','2/6/2009','2/6/2009','2/7/2009','2/7/2009','2/7/2009',
'2/8/2009','2/8/2009','2/8/2009'};
>> c=unique(b)
>> c =
'2/6/2009' '2/7/2009' '2/8/2009'
Are you expecting this?
  1 件のコメント
shaz
shaz 2012 年 12 月 18 日
b={'2/6/2099','2/6/2099','2/6/2099','2/6/2099','2/7/2099','2/7/2099', '2/7/2099','2/8/2099','2/8/2099','2/8/2099','2/10/2099','2/10/2099', '2/12/2099'};
c=unique(b)
the output is
c= '2/10/2099' '2/12/2099' '2/6/2099' '2/7/2099' '2/8/2099'
which is in a random way

サインインしてコメントする。


Jan
Jan 2012 年 12 月 18 日
With a modern Matlab version you can use:
c = unique(b, 'first');

Sebastian
Sebastian 2018 年 1 月 17 日
I know it's a bit late for an answer, but maybe it helps others. If you want to preserve the order of the input of 'unique', you can use the second return parameter. Like that it works for arbitrary data (i.e. strings and numerals, basically every data type 'unique' supports):
a = {'2/6/2009' '2/6/2009' '2/6/2009' '2/7/2009' '2/7/2009' '2/7/2009' '2/8/2009' '2/8/2009' '2/8/2009'};
[~, uIdx] = unique(a);
a(sort(uIdx))
This snippet does the following: Store the indices of the unique elements of 'a' in 'uIdx'. Then return the elements of 'a' from the first to the last using 'sort'.
  1 件のコメント
Jan
Jan 2018 年 1 月 17 日
The problem of shaz was, that he wanted a specific numerical order, in which '6' appears before '10'. Therefore the data must be converted from string to double, such that the sorting works.

サインインしてコメントする。


Steven Lord
Steven Lord 2018 年 1 月 17 日
Convert your date data into a datetime array, then call unique (with or without the 'stable' flag) on the datetime array.
C = {'2/6/2009','2/6/2009','2/6/2009','2/6/2009','2/7/2009','2/7/2009', ...
'2/7/2009','2/10/2009','2/8/2009','2/8/2009'};
D = datetime(C, 'InputFormat', 'MM/dd/uuuu')
unique(D)
unique(D, 'stable')
For purposes of this example I assumed your dates were days in February 2009. If they were the second of each month from June through October (without September) of 2009 swap the MM and dd sections of the InputFormat parameter.
  1 件のコメント
Stephen23
Stephen23 2018 年 1 月 17 日
"For purposes of this example I assumed your dates were days in February 2009. If they were the second of each month from June through October (without September) of 2009 swap the MM and dd sections of the InputFormat parameter."
Or avoid this pointless and confusing ambiguity entirely by using ISO 8601 dates.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeDates and Time についてさらに検索

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by