How to calculate the frequency of a binary event (0 or 1) on a weekday basis over the last 10 years?
이전 댓글 표시
I have a single column Logical matrix with 0 and 1's and a single column weekday char matrix with weekday names. I want to calculate how may times I get a 1 for each weekday for the entire period of both matrices (both are about 10 years). Then the same for 0. Then Id like to visualise it. Any ideas?
답변 (3개)
Azzi Abdelmalek
2015년 5월 28일
n=20
a=randi([0 1],n,1)
b={'monday';'tuesday';'Wednesday';'Thursday';'friday'}
w=b(randi(5,n,1))
v=[num2cell(a) w]
[ii1,jj1,kk]=unique(v(:,2))
out1=[ii num2cell(accumarray(kk,a))]
out0=[ii num2cell(accumarray(kk,~a))]
Andrei Bobrov
2015년 5월 28일
t = datenum([2015 2 14;2015 8 15]);
[N,S] = weekday((t(1):t(2))');
O = rand(numel(N),1) > .5;
% ones
out1 = accumarray(N,O);
% zeros
out0 = accumarray(N,~O);
[~,b] = unique(N);
out = [cellstr(S(b,:)), num2cell([out1,out0])]
Walter Roberson
2015년 5월 28일
Letting Lvec be the logical column vector, and letting Wvec be the character column vector, then
dayorder = 'MTWJFSD'; %the day characters in the order you want to present
%need to translate day characters into bin numbers for counting. But
%potentially some day characters do not appear at all, and potentially
%some wrong characters appear. We could first check for validity and then
%bin against the known characters, but the validity check can give us bin
%numbers as a side-effect, so might as well use them. The bin numbers
%will not match the order of the days, but we can find the map between the
%two at the same time we are checking if any entries were invalid
[unique_daychar, ia, binnum] = unique(Wvec);
[tf, ordermap] = ismember(unique_daychar, dayorder);
unknown_days = unique_daychar(~tf);
if ~isempty(unknown_days)
error(sprintf('Unknown day codes in input: %s', unknown_days(:).'));
end
%so know we have bin numbers with the bins in an arbitrary order (actually
%in the order the characters sort into), and we have a mapping between that
%arbitrary order and our desired presentation order. We can do stats in
%either order. It's just easier to present the output if we do the stats
%in presentation order. That's why we map the bin numbers that we send into
%the counting routine, so that the counts come out in presentation order
stats = accumarray([1+Lvec, ordermap(binnum)], 1, [2, length(dayorder)]);
%the rest is just visualization, make it as pretty as you like
fprintf('Day order: %s\n', dayorder);
fprintf('Counts for 0:\n');
fprintf('%5d', stats(1,:));
fprintf('\nCounts for 1:\n');
fprintf('%5d', stats(2,:));
fprintf('\n');
카테고리
도움말 센터 및 File Exchange에서 MATLAB에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!