0
votes

Comment trouver la moyenne, max et min en fonction de plusieurs ensembles de critères

J'ai trouvé quelques options d'autres postes, mais j'ai du mal à reproduire le code pour mes besoins spécifiques.

J'ai des données climatiques que je souhaiterais trouver la moyenne basée sur la saison à partir de 1910-2015 pour des emplacements spécifiques. P>

Voici un exemple de ce dont j'ai besoin: le PPT moyen pour Centroid_ID C1763_1 en 1911 pour l'hiver (mois 12 de l'année précédente [1910], mois 1 et 2 de l'année en question [1911]), Printemps (mois 3,4,5 en 1911), été (mois 6,7,8 en 1911) et automne (mois 9,10,11 en 1911). Cela aurait alors besoin d'être fait pour tous les identifiants de centroïde individuels pour chaque année. J'ai plus de 400 Centroid_ids uniques des années 1910-2015. P>

J'envisage le nouveau Dataframe à avoir les colonnes Centroid_id, Année, Wint_PPt, SPR_PPT, SUM_PPT, FALL_PPT. P>

 CENTROID_ID    YEAR MONTH  PPT
1       c1763_1 1910     1  52.639
2       c1763_1 1910     2  20.870
3       c1763_1 1910     3  21.706
4       c1763_1 1910     4   9.347
5       c1763_1 1910     5   1.201
6       c1763_1 1910     6  11.267
7       c1763_1 1910     7  41.870
8       c1763_1 1910     8  61.260
9       c1763_1 1910     9  27.815
10      c1763_1 1910    10  67.377
11      c1763_1 1910    11  24.719
12      c1763_1 1910    12  30.212
13      c1763_1 1911     1  88.728
14      c1763_1 1911     2  50.035
15      c1763_1 1911     3  37.720
16      c1763_1 1911     4  12.831
17      c1763_1 1911     5   0.739
18      c1763_1 1911     6  18.198
19      c1763_1 1911     7  74.731
20      c1763_1 1911     8  40.873
21      c1763_1 1911     9  86.340
22      c1763_1 1911    10  36.423
23      c1763_1 1911    11  12.491
24      c1763_1 1911    12  19.428
25      c1763_1 1912     1  11.010
26      c1763_1 1912     2  16.339
27      c1763_1 1912     3  72.017
28      c1763_1 1912     4  25.887
29      c1763_1 1912     5   5.314
30      c1763_1 1912     6   8.595
31      c1763_1 1912     7  47.781
32      c1763_1 1912     8  51.188
33      c1763_1 1912     9  10.931
34      c1763_1 1912    10 119.725
35      c1763_1 1912    11  10.420
36      c1763_1 1912    12   8.777
37      c1763_1 1913     1  27.771
38      c1763_1 1913     2  62.622
39      c1763_1 1913     3  17.533
40      c1763_1 1913     4   8.008
41      c1763_1 1913     5   1.423
42      c1763_1 1913     6   3.773
43      c1763_1 1913     7  42.982
44      c1763_1 1913     8  40.541
45      c1763_1 1913     9  58.495
46      c1763_1 1913    10  22.729
47      c1763_1 1913    11  48.130
48      c1763_1 1913    12  32.049
49      c1763_1 1914     1 104.197
50      c1763_1 1914     2  31.707


2 commentaires

Le titre de votre message pose des questions sur Max et Min, mais votre déclaration de problème ne les mentionne pas.


Désolé, j'ai oublié de modifier. J'ai réalisé que peut-être que c'était trop pour une question et de commencer avec les moyens d'abord, essayez d'abord de comprendre un max et un min même si je pouvais avec l'aide de cette question.


3 Réponses :


1
votes

est-ce?

> data
# A tibble: 81 x 6
# Groups:   CENTROID_ID, YEAR_LEAD [21]
   CENTROID_ID YEAR_LEAD SEASON PPT_AVG PPT_MIN PPT_MAX
   <chr>           <int> <fct>    <dbl>   <dbl>   <dbl>
 1 c1763_1          1910 WINTER    83.5   81.4     85.7
 2 c1763_1          1910 SPRING    72.3   52.7     96.0
 3 c1763_1          1910 SUMMER    49.9   10.9     90.0
 4 c1763_1          1910 AUTUMN    26.4    7.17    63.1
 5 c1763_1          1911 WINTER    60.9   19.0     92.6
 6 c1763_1          1911 SPRING    62.9   58.6     67.4
 7 c1763_1          1911 SUMMER    49.2   23.7     76.4
 8 c1763_1          1911 AUTUMN    43.9   15.1     84.4
 9 c1763_1          1912 WINTER    38.5   18.4     67.9
10 c1763_1          1912 SPRING    72.1   53.4     93.9
# ... with 71 more rows


2 commentaires

Aussi une bonne aide. Merci. Cela ne traite pas de la nécessité de la décision de l'année précédente d'être utilisée en hiver pour l'année en cours (décembre 1910 utilisé pour la moyenne de l'hiver 1911).


Mis à jour le code pour assurer que l'hiver comprend décembre de l'année précédente



0
votes

Assignez simplement à une colonne , puis agrégate : xxx

Si vous avez besoin de plusieurs agrégations de PPT : xxx


4 commentaires

Je pense que cela fonctionnerait aussi bien. Cependant, j'ai besoin de décembre (mois 12) de 1910 pour être utilisé en moyenne de PPT d'hiver pour 1911


Il suffit de régler année avec un autre ifelse expression: df $ année <- avec (df, ifelse (mois == 12, année + 1, année)) . Voir Modifier les nouvelles affectations de colonne dans dans .


C'est bien. Merci! J'ai aussi ajouté dans ma version finale une autre colonne pour (ppt ~ centroid_id + année + saison


Génial d'entendre et content d'aider! Oui, vous pouvez étendre la formule et même des agrégats: somme , médiane , longueur (pour le compte), etc. Codage heureux!



1
votes

Vous pouvez créer une colonne auxiliaire em> de x $ x + x mois / 12 $ code> qui aide à amener en décembre pour l'année dernière à l'année en cours. Et ensuite utiliser simplement agrégat code> de ppt code> sur centroid_id code>, plancher (AUX) code> et étage (Aux% % 1 * 4) code>. Puis remodelez code> pour apporter les saisons de la même ligne.

x$aux <- x$YEAR + x$MONTH/12
y <- aggregate(PPT ~ CENTROID_ID + cbind(YEAR=floor(aux)) + cbind(SEASON=c("WINT",
 "SPR", "SUM", "FALL")[1+floor(aux %% 1 * 4)]), x, mean)
reshape(do.call(data.frame, y), v.names = "PPT", timevar = "SEASON", idvar = 
 c("CENTROID_ID", "YEAR"), direction = "wide")
#   CENTROID_ID YEAR PPT.FALL  PPT.SPR  PPT.SUM PPT.WINT
#1      c1763_1 1910 39.97033 10.75133 38.13233 36.75450
#2      c1763_1 1911 45.08467 17.09667 44.60067 56.32500
#3      c1763_1 1912 47.02533 34.40600 35.85467 15.59233
#4      c1763_1 1913 43.11800  8.98800 29.09867 33.05667
#17     c1763_1 1914       NA       NA       NA 55.98433


1 commentaires

Cela a fonctionné super! Les autres réponses étaient bonnes aussi mais les vôtres ont répondu à la DC pour la dernière année à l'année en cours. MERCI!