Filter löschen
Filter löschen

How to group variable of interests by logical indexing?

1 Ansicht (letzte 30 Tage)
Sonisa
Sonisa am 2 Mär. 2016
Kommentiert: Sonisa am 2 Mär. 2016
I have this sort of data. I want to plot PAW with Pasture 9 Patch 1, Pasture 9 with Patch 3, along with Pasture 9 with Patch 5. I want to use logical indexing as, Pasture (Pasture==9), Patch(Patch==1) and then retrieve PAW data based on it. I tried this,
for ii =1:length(PAW)
Pasture_index = find(Pasture==9);
PAW40pasture(ii) = mean(PAW40(Pasture_index,1));
end
But this did not work. Any suggestions/help will be appreciated.
Pasture Patch PAW
9 1 59.90366347
9 1 58.71485861
9 1 57.35723603
9 1 57.36212973
9 3 57.04769458
9 3 127.7284367
9 3 143.7897127
9 3 143.5349223
9 3 142.5156813
9 5 142.3629269
9 5 148.7025447
9 5 149.7302998
9 5 147.5149873
9 5 88.55115557
9 5 80.52936618
  5 Kommentare
Sonisa
Sonisa am 2 Mär. 2016
all are double. Three column and 16 rows.
Sonisa
Sonisa am 2 Mär. 2016
Image Analyst, I sent you my file. Please have a look on it

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Guillaume
Guillaume am 2 Mär. 2016
First, you're not using logical indexing in your code because of the find. The exact same code without the call to find (i.e. Pasture_index = Pasture==9;) would be using logical indexing.
It's not clear to me why you thought the snippet you wrote would produce the result you want since you never filter for a given patch value.
If all you want is to produce the mean of PAW for identical combinations of pasture and patch then you don't need a loop and just need accumarray:
[ppval, ~, rows] = unique([Pasture, Patch], 'rows'); %assuming that Pasture and Patch are column vectors
PAW40pasture = accumarray(rows, PAW40(:, 1), [], @mean);
out = array2table([ppval, PAW40pasture], 'VariableNames', {'Pasture', 'Patch', 'mean'}) %this line just for pretty display
If you wanted to plot them (against what x axis?) then you could do it with a loop as follows:
figure; hold on;
ppvalues = unique([Pasture, Patch]);
for ppvalue = ppvalues'
inpasturepatch = Pasture == ppvalue(1) & Patch == ppvalue(2); %This is logical indexing. No find
plot(PAW40(inpasturepatch, 1), 'DisplayName', sprintf('Pasture %d, Patch %d', ppvalue(1), ppvalue(2)));
end

Weitere Antworten (1)

Image Analyst
Image Analyst am 2 Mär. 2016
Do you have the stats toolbox? It looks like your data is in a table. You might be able to get the mean for all numbers very easily in one line of code with grpstats:
statarray = grpstats(tbl,groupvar)
  6 Kommentare
Image Analyst
Image Analyst am 2 Mär. 2016
You accepted an answer and said thanks, so I'm assuming you got everything working and this doesn't apply anymore.
Sonisa
Sonisa am 2 Mär. 2016
I have attached data and I want to group data by Pasture 9, patch 1 and date, Pasture 9, Patch 3 and date, and Pasture 9, Patch 5 and date. I used the grpstats to create groupvar. But it is giving me data as the original file which is 1795*4 dimension. Actually i want it to be 598*4 dimension. Hope it makes sense to you.
Thanks so much.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Interactive Control and Callbacks finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by