String 更改代码以适应字符串-Matlab
我有以下代码:String 更改代码以适应字符串-Matlab,string,matlab,count,group-by,cell-array,String,Matlab,Count,Group By,Cell Array,我有以下代码: NI1=[NI{:,1} NI{:,2} NI{:,3}]; [~,NI2]=sort(NI1(:,2)); NI1=NI1(NI2,:); NI1((NI1(:,3) == 0),:) = []; NI1=unique(NI1(:,1:3),'rows'); NI3= unique(NI1(:,1:2),'rows') for mj=1:size(NI3,1) NI3(mj,3)=sum(NI1(:,1) == NI3(mj,1) & NI1(:,2)==NI
NI1=[NI{:,1} NI{:,2} NI{:,3}];
[~,NI2]=sort(NI1(:,2));
NI1=NI1(NI2,:);
NI1((NI1(:,3) == 0),:) = [];
NI1=unique(NI1(:,1:3),'rows');
NI3= unique(NI1(:,1:2),'rows')
for mj=1:size(NI3,1)
NI3(mj,3)=sum(NI1(:,1) == NI3(mj,1) & NI1(:,2)==NI3(mj,2));
end
我最初的细胞阵列NI1有以下几个方面:1)年份;2) 与银行相对应的代码3)与银行员工相对应的代码。例如:
c1 c2 c3
1997 3 850
1997 3 1024
1997 3 5792
我的输出NI3统计了不同年份(c1)在每家银行(c2)工作的分析师数量(c3),例如:
c1 c2 c3
1997 3 14
1997 7 84
1997 11 15
1998 4 1
1998 15 10
1998 3 12
1999 11 17
现在我尝试应用完全相同的代码,但我的最后一列(c3)是一个字符串,因此初始单元数组fir__in如下所示:
1997 3 'ACAD'
1997 3 'ADCT'
1997 3 'ADEX'
我希望获得与NI3中完全相同的输出,但我必须更改代码,因为我的最后一列是字符串
我只遗漏了最后一部分,这是我到目前为止的代码
ESTIMA=num2cell(I{:,6});
ANALY=num2cell(I{:,7});
YEAR = num2cell(T_ANNDAT3);
fir_ins=[YEAR ESTIMA I{:,1}];
fir_ins= sortrows(fir_ins,2);
[~, in2,~] = unique(strcat(fir_ins(:,2),fir_ins(:, 3)));
fir_ins = fir_ins(in2,:);
fir_ins= sortrows(fir_ins,[1 2]);
fir_ins2=fir_ins(:,1:2);
fir_ins2=unique(cell2mat(fir_ins2(:,1:2)),'rows');
此部分不起作用:
for jm=1:size(fir_ins2,1)
fir_ins2(jm,3)=sum(cell2mat(fir_ins(:,1))) == fir_ins2(jm,1) & cell2mat(fir_ins(:,2))==cell2mat(fir_ins2(jm,2));
end
借助accumarray
功能,您可以更高效地执行此“聚合”。其思想是将前两列(行主键)映射为下标(从1开始的索引),然后将这些下标传递给accumarray
进行计数
下面是一个例子来说明。首先,我先生成一些类似于您的随机数据:
% here are the columns
n = 150;
c1 = sort(randi([1997 1999], [n 1])); % years
c2 = sort(randi([3 11], [n 1])); % bank code
c3 = randi(5000, [n 1]); % employee ID as a number
c4 = cellstr(char(randi(['A' 'Z']-0, [n,4]))); % employee ID as a string
% combine records (NI)
X = [c1 c2 c3]; % the one with numeric worker ID
X2 = [num2cell([c1 c2]) c4]; % {c1 c3 c4} % the one with string worker ID
请注意,出于我们的目的,workers ID列是否表示为数字或字符串并不重要;我们不使用它们,只使用表示行“主键”的前两列:
% find the unique primary keys and their subscript mapping
[years_banks,~,ind] = unique([c1 c2], 'rows');
% count occurences (as in SQL: SELECT COUNT(..) FROM .. GROUPT BY ..)
counts = accumarray(ind, 1);
% build final matrix: years, bank codes, counts
M = [years_banks counts];
我用伪造的数据得到了以下结果:
>> M
M =
1997 3 13
1997 4 11
1997 5 15
1997 6 14
1997 7 4
1998 7 11
1998 8 24
1998 9 15
1999 9 1
1999 10 22
1999 11 20
这样的代码效率更高。非常感谢。