MATLAB For Loop根据另一列中的条目来计算一列中%s



我有50个带有多个评分列的电子表格:一列(AG(的数字编码为1:13,另一列(SEC(的数字编号为1:6。

例如:

AG   SEC
1    1
2    1
4    1
13   1
3    2
12   2

我想写一个for循环,计算所有的1。对应于#s 1:5英寸的SEC。AG.(输出将是3——它不会计算对应于13的1(。我需要为中的所有#发生这种情况。秒(1:6(。最终输出将在第一列中显示电子表格名称,并计数。在每一列中,SEC=1,2,3,4,5,6。

我当前的代码为total创建了一个变量。AG计入。SEC,但是非歧视性的(计算.AG中给定任何数字的次数,而不是计算特定值(

scoringfiles是一个50项路径列表(当我执行readtable(scoringfiles)时,它会遍历列表并读取excel文件。filelist是一个只有文件名的50项列表。

for i=1:length(scoringfiles)
if contains(filelist(i,:),"sheet")
disp(i)
sheetnum=[sheetnum extractBetween(filelist{i},1,4)]

s1=[s1 length(find(readtable(scoringfiles(i,:)).SEC==1))]
s2=[s2 length(find(readtable(scoringfiles(i,:)).SEC==2))]    
s3=[s3 length(find(readtable(scoringfiles(i,:)).SEC==3))]
s4=[s4 length(find(readtable(scoringfiles(i,:)).SEC==4))]
s5=[s5 length(find(readtable(scoringfiles(i,:)).SEC==5))]
s6=[s6 length(find(readtable(scoringfiles(i,:)).SEC==6))]
elseif contains(filelist(i,:),"graph")
disp("not sheet")
end
end

在MATLAB中,ij是虚单位。为了避免重新定义它,您应该养成使用iijj作为循环变量的习惯,而不是使用ij

现在回到主要问题:

假设您已经将文件内容读取到data变量中。这将是一个Nx2数组。

只有当AG在1:5范围内时,您才关心它。让我们用true创建一个filter数组,其中AG在范围内,false在其他地方。

filter = data(:, 1) >= 1 & data(:, 1) <= 5;

为了便于阅读,我们首先将列拆分为两个变量。使用过滤器只选择符合我们条件的行。

ag = data(filter, 1);
sec = data(filter, 2);

现在,您需要遍历sec中的每个唯一值,并计算ag条目的数量。

unique_sec = unique(sec);
counts = zeros(size(unique_sec)); % Preallocate a zeros array to save our answer in
for ii = 1:length(unique_sec)
sec_value = unique_sec(ii); % Get the value of SEC
matches = sec == sec_value; % Make a filter for rows that have this value
% matches is a logical array. true = 1, false = 0. sum gives number of trues.
counts(ii) = sum(matches); 
end

或者,如果你不想在之前进行过滤,你可以在循环中对1 <= AG <= 5进行过滤

ag = data(:, 1);
sec = data(:, 2);
unique_sec = unique(sec);
counts = zeros(size(unique_sec)); 
for ii = 1:length(unique_sec)
sec_value = unique_sec(ii);
matches = sec == sec_value & ag >= 1 & ag <= 5; % Add more conditions to the filter
counts(ii) = sum(matches); 
end

如果要对多个文件执行此操作,请对它们进行迭代,并将文件读取到data变量中。

在Pranav的帮助下,我学会了如何应用过滤器。它很简单,只需在for循环的每一行中添加过滤器,就可以迭代读取我的电子表格。见下文:

本例仅关注S1和S2。实际上,我为6个不同的#创建了这个,每个电子表格创建6个计数表。

for i=1:length(scoringfiles)
filter1 = readtable(scoringfiles(i,:)).AG >= 1;
filter2 = readtable(scoringfiles(i,:)).AG <= 5;
if contains(filelist(i,:),"sheet")
disp(i)
sheetnum=[sheetnum extractBetween(filelist{i},1,4)]

s1=[s1 length(find(readtable(scoringfiles(i,:)).SEC==1 & filter1 & filter2))]
s2=[s2 length(find(readtable(scoringfiles(i,:)).SEC==2 & filter1 & filter2))]    

elseif contains(filelist(i,:),"graph")
disp("not sheet")
end
end

相关内容

  • 没有找到相关文章