Selecting rows with maximum value with consecutive 3 days occurrence

1 vue (au cours des 30 derniers jours)
Poulomi Ganguli
Poulomi Ganguli le 28 Sep 2017
Commenté : Jan le 30 Sep 2017
I have following matrix in which first, second, third column show year, month, day and value from event 1. However, some of the days are consecutive. I need to choose only those days in a year which contains maximum value in column 3 out of consecutive occurrences.
1970 1 13 0.4659 1970 1 18 29.85
1970 1 14 0.4423 1970 1 18 29.85
1971 1 21 0.5851 1971 1 26 25.63
1971 1 23 0.4701 1971 1 26 25.63
1971 3 18 0.4938 1971 3 19 15.48
1972 2 2 0.4272 1972 2 2 35.33
1972 8 8 0.3888 1972 8 7 7.521
1972 12 27 0.5758 1972 12 28 25.25
1973 12 19 0.5834 1973 12 19 25.97
1973 12 20 0.5414 1973 12 19 25.97
1973 12 23 0.5011 1973 12 19 25.97
1974 1 27 0.4437 1974 1 30 51.96
1974 2 11 0.5594 1974 2 11 45.36
1974 9 2 0.49 1974 9 5 23.04
1975 1 14 0.4255 1975 1 19 17.99
1975 1 15 0.4486 1975 1 19 17.99
1975 9 27 0.381 1975 9 25 5.825
1976 10 11 0.3337 1976 10 14 25.12
1976 12 6 0.3528 1976 11 30 25.93
1977 3 15 0.4784 1977 3 15 15.4
1977 10 8 0.43136 1977 10 6 3.325
1977 12 8 0.4412 1977 12 9 24.1
1978 2 19 0.43 1978 2 25 22.38
1978 2 25 0.4208 1978 2 25 22.38
1978 12 23 0.3763 1978 12 23 24.88
1979 1 3 0.5779 1978 12 28 20.26
1979 2 8 0.4116 1979 2 7 15.01
1979 12 15 0.411 1979 12 15 21.24
1980 3 26 0.47822 1980 3 31 22.5
1980 3 27 0.436 1980 3 31 22.5
The desired output matrix is:
1971 1 13 0.46 1970 1 18 29.85
1971 1 21 0.58 1971 1 26 25.63
1971 3 18 0.49 1971 3 19 15.48
1972 2 2 0.42 1972 2 2 35.33
1972 8 8 0.38 1972 8 7 7.521
1972 12 27 0.57 1972 12 28 25.25
1973 12 19 0.58 1973 12 19 25.97
1973 12 23 0.50 1973 12 19 25.97
1974 1 27 0.44 1974 1 30 51.96
1974 2 11 0.55 1974 2 11 45.36
The associated .mat file is also attached.
  2 commentaires
Jan
Jan le 28 Sep 2017
Please provide the data such, that they can by used by copy&paste. Prefer something like
data = [1 2 3; ...
4 5 6]
and avoid using commas as decimal separators. Currently all readers have a lot to edit to test their suggestions and this is rather inefficient, because it is enough if this is done once - by yourself.
Poulomi Ganguli
Poulomi Ganguli le 28 Sep 2017
Modifié(e) : Poulomi Ganguli le 28 Sep 2017
Thanks!Then in that case, I'll add a mat file.

Connectez-vous pour commenter.

Réponse acceptée

Guillaume
Guillaume le 28 Sep 2017
Modifié(e) : Guillaume le 28 Sep 2017
Finding which days go together:
daygroup = cumsum([1; days(diff(datetime(Z(:, 1:3)))) > 3]);
Then, if you don't want to define a filter function:
[~, grouprow] = splitapply(@max, Z(:, 4), daygroup);
filteredZ = splitapply(@(rows, group) rows(grouprow(group(1)), :), Z, daygroup, daygroup)
If you're happy with a separate filtering function
function rows = filterrows(rows)
[~, idx] = max(rows(:, 4));
rows = rows(idx, :);
end
then,
filteredZ = splitapply(@filterrows, Z, daygroup)
  2 commentaires
Poulomi Ganguli
Poulomi Ganguli le 30 Sep 2017
Many thanks! just to be curious rows and group are not MATLAB function, how it's working here?
Jan
Jan le 30 Sep 2017
@Poulomi Ganguli: "rows" and "group" are the input variables of the anonymous function provided to splitapply.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Loops and Conditional Statements 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