« Questions-r » : différence entre les versions
arrange question martiste
(rajout en vrac) |
(arrange question martiste) |
||
Ligne 66 : | Ligne 66 : | ||
Regarde ?na.approx pour plus de détails sur son fonctionnement | Regarde ?na.approx pour plus de détails sur son fonctionnement | ||
== Programmation fonctionnelle | == Programmation fonctionnelle == | ||
Question de martiste | '''Question de martiste''' | ||
J'ai un jeu de données avec des températures à pas de temps horaire, le tout sur plusieurs années (et plusieurs stations). J'aimerais connaître, pour chaque année et pour chaque station, le nombre de séquences où la température a dépassé les 19°C, ainsi que la durée de la séquence la plus longue. Avec une boucle, j'aurais créé un nouveau champ pour lequel j'incrémente une valeur de séquence à chaque fois que T>19 et que T-1<19. Je regarde la valeur max de ma séquence, et la longueur max de ces séquences également. Mais comment faire sans boucle ? | J'ai un jeu de données avec des températures à pas de temps horaire, le tout sur plusieurs années (et plusieurs stations). J'aimerais connaître, pour chaque année et pour chaque station, le nombre de séquences où la température a dépassé les 19°C, ainsi que la durée de la séquence la plus longue. Avec une boucle, j'aurais créé un nouveau champ pour lequel j'incrémente une valeur de séquence à chaque fois que T>19 et que T-1<19. Je regarde la valeur max de ma séquence, et la longueur max de ces séquences également. Mais comment faire sans boucle ? | ||
'''Réponse de lvaudor''' | |||
<syntaxhighlight lang="r"> | |||
get_sequences=function(donnees, Temp){ | get_sequences=function(donnees, Temp){ | ||
result = donnees %>% | result = donnees %>% | ||
Ligne 127 : | Ligne 88 : | ||
mutate(data=purrr::map(data,get_sequences,Temp=19)) %>% | mutate(data=purrr::map(data,get_sequences,Temp=19)) %>% | ||
tidyr::unnest(cols=c(data)) | tidyr::unnest(cols=c(data)) | ||
</syntaxhighlight> | |||
ou bien (autre syntaxe possible pour map), comme ça: | ou bien (autre syntaxe possible pour map), comme ça: | ||
<syntaxhighlight lang="r"> | |||
result= dat %>% | result= dat %>% | ||
group_by(chmes_coderhj,chmes_anneebiol) %>% | group_by(chmes_coderhj,chmes_anneebiol) %>% | ||
Ligne 133 : | Ligne 98 : | ||
mutate(data=purrr::map(data,~get_sequences(.,Temp=19))) %>% | mutate(data=purrr::map(data,~get_sequences(.,Temp=19))) %>% | ||
tidyr::unnest(cols=c(data)) | tidyr::unnest(cols=c(data)) | ||
Différence entre avec et sans '~' devant la fonction: | |||
* soit map attend le nom d'une fonction | |||
: Dans ce cas l'argument sur lequel il itère doit être le premier argument de la fonction | |||
* soit map attend une formule (précédée d'un "~", donc) | |||
: Dans ce cas il y a un peu plus de souplesse sur la position de l'argument sur lequel on itère | |||
soit map attend le nom d'une fonction | |||
soit map attend une formule (précédée d'un "~", donc) | |||
Tu pourrais dire ~ get_sequences(data, Temp=.) pour itérer sur une variable qui donnerait un seuil de température, par exemple | Tu pourrais dire ~ get_sequences(data, Temp=.) pour itérer sur une variable qui donnerait un seuil de température, par exemple | ||
et non plus itérer sur le premier argument, "data" | et non plus itérer sur le premier argument, "data" | ||
Si tu donnes le nom de la fonction, tu peux quand-même rajouter des arguments "secondaires" | Si tu donnes le nom de la fonction, tu peux quand-même rajouter des arguments "secondaires" | ||
mais tu les rajoutes directement comme arguments optionnels à la fonction "map", pas dans un simulacre d'appel à la fonction que tu itères | mais tu les rajoutes directement comme arguments optionnels à la fonction "map", pas dans un simulacre d'appel à la fonction que tu itères | ||
L'utilisation des formules c'est un subtilité introduite pour gérer les fonctions qui n'ont pas les arguments "dans l'ordre le plus pratique au regard de ce qu'on souhaite faire". | L'utilisation des formules c'est un subtilité introduite pour gérer les fonctions qui n'ont pas les arguments "dans l'ordre le plus pratique au regard de ce qu'on souhaite faire". | ||
Et, pour finir, si je veux en sortir 1) le nombre total de séquences, et 2) la durée de la séquence la plus longue, est-ce que tu me conseilles de l'inclure dans la fct 'get_sequences', ou de repartir des résultats de cette fonction et d'alimenter une nouvelle ? | Et, pour finir, si je veux en sortir 1) le nombre total de séquences, et 2) la durée de la séquence la plus longue, est-ce que tu me conseilles de l'inclure dans la fct 'get_sequences', ou de repartir des résultats de cette fonction et d'alimenter une nouvelle ? | ||
LiseV — 23/08/2021 | LiseV — 23/08/2021 |