2016-01-26 2 views
2

У меня есть сотовый 22124x1 и содержать повторяющиеся значения, я хочу знать, сколько раз эти значения дублируют и их индексПоиск Повторяющиеся значения строк в массиве две ячейки 22124x1

первая ячейка содержит эти значения Datacell =

'221853_s_at' 
    '221971_x_at' 
    '221971_x_at' 
    '221971_x_at' 
    '221971_x_at' 
    '222031_at' 
    '222031_at' 
    '31637_s_at' 
    '37796_at' 
    '38340_at' 

символ клетки:

'OR1D4 ' 
    ' OR1D5' 
    ' UTP14C' 
    'GTF2H2 ' 
    'ZNF324B ' 
    ' LOC644504' 
    'JMJD7 ' 
    'ZNF324B ' 
    'JMJD7-PLA2G4B' 
    ' OR2A5 ' 
    'OR1D4 ' 

Например я хочу выход из ячейки 1, как этот

ID    duplicated  index 
'221853_s_at'  1    1 
'221971_x_at'  4    {2:5,1} 

Я попытался использовать уникальный, но он не работает. Любая помощь будет высоко оценен

+2

Вы можете уменьшить ваш пример вход, пожалуйста, и добавьте резную нужный пример вывод – Dan

+2

Как «символ ячейка», связанные с вашим вопрос? Вы хотите найти дубликаты там? – dasdingonesin

+0

Ваш пример вывода не имеет смысла. '' 221853_s_at'' не дублируется в данных. Вы хотите подсчет вхождений строк * all * или только дублированных? Как вы определяете 'duplicated'? Это общий счет строки в массиве или 'total count - 1'? – excaza

ответ

1

Создание индексов в визуально приятной материи не обязательно является тривиальным упражнением. Это сделано проще, если вы предполагаете, что d сортируется.

Альтернативы использование accumarray:

d = {'221853_s_at'; '221971_x_at'; '221971_x_at'; '221971_x_at'; '221971_x_at'; ... 
    '222031_at'; '222031_at'; '31637_s_at'; '37796_at'; '38340_at' ... 
    }; 
d = sort(d); % Sort to make indices easier 

% Find unique strings and their locations 
[uniquestrings, ~, stringbin] = unique(d); 
counts = accumarray(stringbin, 1); 

repeatidx = find(counts - 1 > 0); 
repeatedstrings = uniquestrings(repeatidx); 
repeatcounts = counts(repeatidx) - 1; 

% Find where string repeats start 
startidx = find([true; diff(stringbin) > 0]); 
repeatstart = startidx(repeatidx); 
repeatend = startidx(repeatidx + 1) - 1; 

% Generate table, requires R2013b or newer 
t = table(repeatedstrings, repeatcounts, repeatstart, repeatend, ... 
      'VariableNames', {'ID', 'Duplicated', 'StringStart', 'StringEnd'} ... 
     ); 

Что дает:

t = 

     ID   Duplicated StringStart StringEnd 
    _____________ __________ ___________ _________ 

    '221971_x_at' 3    2    5   
    '222031_at'  1    6    7   
+0

спасибо @excaza –

1
d = { '221853_s_at' 
    '221971_x_at' 
    '221971_x_at' 
    '221971_x_at' 
    '221971_x_at' 
    '222031_at' 
    '222031_at' 
    '31637_s_at' 
    '37796_at' 
    '38340_at'}; 

[ids,ia,ic]=unique(d); 

идентификаторы имеют уникальные строки IA имеет индекс, соответствующий экземпляр уникальной строки в пределах я IC имеет индекс, соответствующий которого запись в идентификаторах состоит в том, индексе в г

[ncnt] = hist(ic,1:numel(ids)) - 1; % minus 1 since you only want duplicates 

ncnt = 

    0  3  1  0  0  0 

получает вас количество дубликатов для ид =

'221853_s_at' 
'221971_x_at' 
'222031_at' 
'31637_s_at' 
'37796_at' 
'38340_at' 

ic имеет таблицу поиска для индексов .. использовать поиск или логическую индексацию

+0

Thx @haindbaii, но он работает только для короткой колонки. У меня есть 22124x1 –

+2

@Abdulrahman, который не изменит код. – excaza

Смежные вопросы