MATLAB Answers

0

Find mean of rows containing decimal numbers in between integers in a column

Asked by Aleya Marzuki on 17 Aug 2019 at 14:56
Latest activity Edited by Aleya Marzuki on 18 Aug 2019 at 11:41
I have a column with mostly decimal numbers and some integers
Example (the integers are in bold). - Y = [1 0.098 0.00076 0.01 2 0.099 0.007 2 0.003 0.04 0.1 4]. The integers range from 1 - 4.
I want to find the average of the numbers in between the integers, essentially [1 mean(0.098 0.00076 0.01) 2 mean (0.099 0.007) 2 mean(0.003 0.04 0.1) 4].
What would be the best way to do this? Is it recommended I turn the integers into a grouping variable?

  0 Comments

Sign in to comment.

Tags

4 Answers

Answer by madhan ravi
on 17 Aug 2019 at 15:51
Edited by madhan ravi
on 17 Aug 2019 at 16:01
 Accepted Answer

Y = [1 0.098 0.00076 0.01 2 0.099 0.007 2 0.003 0.04 0.1 4];
Y=Y(:);
ix=diff(find(~mod(Y,1)))-1;
assert(nnz(~mod(Y,1))>2,'atleast one gap between integers is required')
y=Y(mod(Y,1)~=0);
V=mat2cell(y(1:sum(ix)),ix);
Wanted=cellfun(@mean,V)

  7 Comments

Works great! There just needs to be an integer at the end of the array and all the output is there. Thank you :)
Try the below, there was a minor error before:
Y=Y(:);
ii=~mod(Y,1);
ix=diff(find(ii))-1;
y=Y(mod(Y,1)~=0);
assert(~isempty(nonzeros(ix)),'Atleast one gap between integers is required')
V=mat2cell(y(1:sum(ix)),ix);
W=cellfun(@mean,V);
Wanted = zeros(nnz(ii)+numel(W),1);
Wanted(1:2:end) = Y(ii);
Wanted(2:2:end) = W
Cool, thanks again!
*EDIT*
I accepted this answer in the end because it accounts for there occasionally being no spaces between integers, which is what my actual data has (again should have specified this in my question, apologies).

Sign in to comment.


Answer by Stephen Cobeldick on 17 Aug 2019 at 16:04
Edited by Stephen Cobeldick on 18 Aug 2019 at 4:10

>> Y = [1,0.098,0.00076,0.01,2,0.099,0.007,2,0.003,0.04,0.1,4];
>> X = cumsum([1;diff(~mod(Y(:),1))]~=0);
>> Z = accumarray(X(:),Y(:),[],@mean)
Z =
1
0.03625333333333333
2
0.05300000000000001
2
0.04766666666666667
4
EDIT: minor changes based on comments below.

  6 Comments

Gotcha! Sorry for not specifying I was using a column vector, thank you :)
+1
Y = [1,0.098,0.00076,0.01,2,0.099,0.007,2,0.003,0.04,0.1,4];
out = accumarray(cumsum([1;diff(mod(Y(:),1) == 0)~=0]),Y(:),[],@mean)
Compact little gem, though I'm not fan of "~~x", IMO "x~=0" is clearer and perhaps faster.

Sign in to comment.


Answer by darova
on 17 Aug 2019 at 15:27

Use ismembertol() or ismember() (round values to some tolerance if needed) to find indices of integer values
Use loop to find mean

  0 Comments

Sign in to comment.


Answer by KALYAN ACHARJYA on 17 Aug 2019 at 15:52
Edited by KALYAN ACHARJYA on 17 Aug 2019 at 16:08

Its just the Jugaar non-efficient code
# Recomended not to use, I tried few minutes, hence I posted here
Y=[1 0.098 0.00076 0.01 2 0.099 0.007 2 0.003 0.04 0.1];
data1=find(Y>=1);
mean_data=zeros(1,length(data1));
for i=1:length(data1)
if i==length(data1)
mean_data(i)=mean(Y(data1(i)+1:end));
else
mean_data(i)=mean(Y(data1(i)+1:data1(i+1)-1));
end
end
mean_data
Result:
mean_data =
0.0363 0.0530 0.0477
*Elapsed time is 0.013581 seconds.

  2 Comments

Kalyan the result is completely wrong. How did you assume it was 3??
mean_data=zeros(1,3);
How would you preallocate mean_data for the below example???
Y=[1 0.098 0.00076 0.01 2 0.099 0.007 2 0.003 0.04 0.1 4 .3 .1 .4 3 0 3];

Sign in to comment.