finding the frequency of a series of numbers in an array

73 Ansichten (letzte 30 Tage)
given the data set
data=[1,1,1,2,2,3,3,3,4,4,3,3,5,5,5,6,7,8,9,9,9,1,1,1,1,10,10,1,1,1,2,2,2,2,1];
I want to find the number of occurrences (frequency) of each series of numbers in the array. For example, I know there are eleven places that 1 occurs.
k=1
location=find(data==k)
location = 1 2 3 22 23 24 25 28 29 30 35
But I want the frequency (number of series that occur in the data set for a given value in the array. Also, I want to exclude series of data in the frequency count if they fall below a threshold value (arbitrarily a value of 2 in this case). The output for the one value should be freq=3
I want the output to be a 10x2 array with the frequency of each number value 1 through 10 to be sorted in order
seriesfreq=
1 3
2 2
3 1
4 1
5 1
6 0
7 0
8 0
9 1
10 1
Please help!

Akzeptierte Antwort

Guillaume
Guillaume am 4 Jun. 2015
Bearbeitet: Guillaume am 4 Jun. 2015
A method with no loop:
data=[1,1,1,2,2,3,3,3,4,4,3,3,5,5,5,7,8,9,9,9,1,1,1,1,10,10,1,1,1,2,2,2,2,1];
threshold = 2;
transpos = find(diff(data)); %gives the position of the end of each series of identical number
transvals = data(transpos); %gives the corresponding value of each series
transvals(diff([0 transpos numel(data)+1]) < threshold) = []; %remove values for which the run is shorter than threshold
bins = min(data):max(data)';
[bins; histcounts(transvals, [bins Inf])]' %get the histogram of the runs
  1 Kommentar
Joe
Joe am 4 Jun. 2015
I've combined the answeres into one use with a threshold
data=[1,1,1,2,2,2,3,6,3,3,10,3,10];
threshold=1;
transpos = find(diff(data));
transpos1=[transpos, transpos(end)+1];
transvals = data(transpos1);
transvals(diff([0 transpos1 numel(data)+1])<threshold)=[0];
for k=1:1:10
frequency(k)=length(find(transvals==k));
end
Thanks for all the help!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (4)

Jan
Jan am 4 Jun. 2015
[value, len] = RunLength(data);
bin = min(value):max(value);
h = histc(value(len > 2), bin);
result = [bin.', h.']

Azzi Abdelmalek
Azzi Abdelmalek am 3 Jun. 2015
Bearbeitet: Azzi Abdelmalek am 3 Jun. 2015
data=[1,1,1,2,2,3,3,3,4,4,3,3,5,5,5,6,7,8,9,9,9,1,1,1,1,10,10,1,1,1,2,2,2,2,1];
ii=unique(data);
for k=1:numel(ii)
a=data==ii(k);
b=[0 a 0];
out(k)=sum(strfind(b,[1 0])-strfind(b,[0 1])>=2);
end
out
  2 Kommentare
Joe
Joe am 4 Jun. 2015
If there are a fixed number of places in this array (for example k=1:1:10) and the data array is missing the number 6
data=[1,1,1,2,2,3,3,3,4,4,3,3,5,5,5,7,8,9,9,9,1,1,1,1,10,10,1,1,1,2,2,2,2,1]
is there a way to output a zero in its place to make it a 10x1 array?
Azzi Abdelmalek
Azzi Abdelmalek am 4 Jun. 2015
data=[1,1,1,2,2,3,3,3,4,4,3,3,5,5,5,6,7,8,9,9,9,1,1,1,1,10,10,1,1,1,2,2,2,2,1];
ii=min(data):max(data);
for k=1:numel(ii)
a=data==ii(k);
b=[0 a 0];
out(k)=sum(strfind(b,[1 0])-strfind(b,[0 1])>=2);
end
out

Melden Sie sich an, um zu kommentieren.


Suvidha Tripathi
Suvidha Tripathi am 24 Okt. 2018
data=[1,1,1,2,2,3,3,3,4,4,3,3,5,5,5,7,8,9,9,9,1,1,1,1,10,10,1,1,1,2,2,2,2,1]
unique_data=unique(data);
disp("series_no "+"frequency")
for i=1:length(unique_data)
[~,indices]=find(data==unique_data(i));
freq(i)=length(indices);
disp(unique_data(i)+" "+freq(i))
end

Manoel Rodrigues Trigueiro
Manoel Rodrigues Trigueiro am 30 Mär. 2019
% Frequency order function %
function f = freq(X)
a = unique(X); len_X = length(a);
for i=1:len_X
f(i) = mode(X);
ind = find(mode(X)==X);
for j=1:length(ind)
X(ind(j)) = NaN;
end
end
end

Kategorien

Mehr zu Matrices and Arrays finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by