For Loop or function for repeating action

8 ビュー (過去 30 日間)
JacquelineK
JacquelineK 2017 年 9 月 13 日
コメント済み: JacquelineK 2017 年 9 月 21 日
I have A with 225 x 2 vectors. One Column is a variable always ranking from 1-5 (like grades) and the second is also numeric. I now want to calculate the mean, median, first and third quantile of the second vector, for each grade score.
The result I need, need to be interpreted like: mean(age) of A students better than mean(age) of B students
Grades 1 2 3 [etc]
Mean
Median
1st Qntl
3rd Qntl
I did it all by manually, which is kind of a lot, because I have 8 hypothesis for which the calculations are almost the same (the matrix A is in reality 225*11 but I only need 2-3 vectors per hypothesis). Now I wonder if there is a way to "do it faster and more efficient" namely in a for loop?
where I can write something like:
for i = 1:5
if ERM == i
mean_Hyp_1 = nanmean(A(ERM==1;:,2))
meadian_Hyp_1 = nanmedian(A(ERM==i;:,2)
etc
end
end
Thanks in advance

採用された回答

Vishwas
Vishwas 2017 年 9 月 19 日
You had the right idea. "find" function can be used to find all the rows where ERM == 1,2,.. in a loop and the result can be calculated.
Let me show this via an example:
a = [1;3;2;4;5;1;2;4;3;5;3;2;1]
b = [10;15;24;54;36;57;87;98;65;78;05;48;65]
input = [a b]
mean = []
median = []
for i = 1:5
mean(i) = nanmean(input(find(input(:,1)==i), 2))
median(i) = nanmedian(input(find(input(:,1)==i), 2))
end
I the case above, we are using the "find" function on the first column of input, extracting the indices for all values of input(:,1) == i and finding the mean of all the values from the second column.
  9 件のコメント
Stephen23
Stephen23 2017 年 9 月 20 日
@Vishwas Vijaya Kumar: is there a good reason for shadowing the inbuilt input function?
José-Luis
José-Luis 2017 年 9 月 20 日
編集済み: José-Luis 2017 年 9 月 20 日
And mean().
And median().
And that's some pretty tortured indexing.

サインインしてコメントする。

その他の回答 (1 件)

Tim Berk
Tim Berk 2017 年 9 月 19 日
You can use the condition A(:,1) == i as indexing for which values in A(:,2) to consider, i.e.
A = [1 2 3 1 1 2 3; 4 5 6 7 8 9 0]'
for i = 1:3
mean_A(i) = nanmean(A(A(:,1)==i,2));
% etc..
end
  1 件のコメント
JacquelineK
JacquelineK 2017 年 9 月 21 日
Hi Tim,
Thanks to you my codes for all my hypothesis are hapening so much faster. Now I am on my last hypothesis, which is the same method as before with one constraint. Before I open a new question, I just wanted to see, if you can help.
matrix A with 5 columns. First column with grades (1-5) and second column with years ranking from 2008-2013. Rest of columns again numeric.
First: "Cluster" the years 2008-2010, 2011-2013, 2014-2016
Second: Search Grades between the years 2008-2010, 2011-2013, 2014-2016
Third: Calculate the means of every column according to grade and clustered year.
The main problem I have encountered is that Matlab doesn't let me write the expression
for i = 2008:2010 ...etc
I did it again manually (mean of each year for all variables). But I cannot include, like your previous code showed me.
for i= 1:5
...(A(:,i)==i)..etc

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeMathematics についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by