我有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中,i
和j
是虚单位。为了避免重新定义它,您应该养成使用ii
和jj
作为循环变量的习惯,而不是使用i
和j
。
现在回到主要问题:
假设您已经将文件内容读取到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