Effacer les filtres
Effacer les filtres

Averaging values in column 2 if column 1 falls within a certain range

2 vues (au cours des 30 derniers jours)
Nev
Nev le 29 Mai 2019
Commenté : Nev le 31 Mai 2019
Hi,
I am pretty stuck and would really appreciate some/any help or a push in the right direction.
I have matrix "B" which has time(sec) in column 1 and Diameter in column 2.
I am trying to do something like this:
If column 1 is between n and n+0.99 seconds, average all the value in column 2 and also indicate what value 'n' was in the column next to it. Repeat this for n+1 all the way to the end.
so the intervals will be 1 - 1.99 , 2 - 2.999 , 3 - 3.99 all the way to 60 seconds.
Thank you,
Nev

Réponse acceptée

Alex Mcaulley
Alex Mcaulley le 29 Mai 2019
Try this (just changing by your real B):
n = 1:60;
B = rand(1000,2);
B(:,1) = linspace(1,60,1000);
means = arrayfun(@(i) mean(B(B(:,1)>=n(i)&B(:,1)<n(i+1),2)),1:(numel(n)-1));
Nextn = B(arrayfun(@(i) find(B(:,1)>=n(i)&B(:,1)<n(i+1),1,'last'),1:(numel(n)-1))+1,1);
  6 commentaires
Nev
Nev le 30 Mai 2019
Hi,
I only get the mean table with the correct values nan 43.8237 etc when I use the below code (code 1). If i use code 2 the values in B(:,1) are changed and so the means from B(:,2) provided are incorrect, maybe I haven't substituted something correctly.
However, code 1 does what I need it to do, so thank you for your help! :) I would never have been able to do it without your help
%% Code 1
n = 1:60;
B(:,1);
means = arrayfun(@(i) mean(B(B(:,1)>=n(i)&B(:,1)<n(i+1),2)),1:(numel(n)-1));
%% Code 2
n = 1:60;
B(:,1) = linspace(1,60,7841);
means = arrayfun(@(i) mean(B(B(:,1)>=n(i)&B(:,1)<n(i+1),2)),1:(numel(n)-1));
Nextn = B(arrayfun(@(i) find(B(:,1)>=n(i)&B(:,1)<n(i+1),1,'last'),1:(numel(n)-1))+1,1);
Alex Mcaulley
Alex Mcaulley le 30 Mai 2019
Yes, this line:
B(:,1) = linspace(1,60,7841);
was just for my example data. The correct code is
n = 1:60;
means = arrayfun(@(i) mean(B(B(:,1)>=n(i)&B(:,1)<n(i+1),2)),1:(numel(n)-1));
Nextn = B(arrayfun(@(i) find(B(:,1)>=n(i)&B(:,1)<n(i+1),1,'last'),1:(numel(n)-1))+1,1);

Connectez-vous pour commenter.

Plus de réponses (1)

Steven Lord
Steven Lord le 30 Mai 2019
I would use groupsummary specifying the groupbins input as either a list of bin edges or (if you can convert your time data to a duration array) 'second' and the method as 'mean'.
  1 commentaire
Nev
Nev le 31 Mai 2019
Hi Steven,
Thanks for this. I will also give this a go as I have another set of data that requires intervals that are less than n+1 (n to n+0.5 for example) which I can't seem to do with the above code as it says that "Array indices must be positive integers or logical values"
Thanks :)!
Nevine

Connectez-vous pour commenter.

Catégories

En savoir plus sur Performance and Memory dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by