<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://isig-wiki.ens-lyon.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=88.126.37.20</id>
	<title>Wiki ISIG - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://isig-wiki.ens-lyon.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=88.126.37.20"/>
	<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/w/Sp%C3%A9cial:Contributions/88.126.37.20"/>
	<updated>2026-10-08T06:28:13Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Reseaux&amp;diff=268</id>
		<title>Reseaux</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Reseaux&amp;diff=268"/>
		<updated>2022-01-19T13:56:24Z</updated>

		<summary type="html">&lt;p&gt;88.126.37.20 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 🏠 Intégration au sein du labo ==&lt;br /&gt;
&lt;br /&gt;
* [https://umr5600.cnrs.fr/fr/accueil/ UMR 5600 EVS Environnement Ville Société] &lt;br /&gt;
* [https://atelier8.hypotheses.org/ Atelier spatialités numériques et géomatique (anciennement atelier 8)] &lt;br /&gt;
&lt;br /&gt;
== 🏙️ Intégration du labo/de l&#039;équipe à d&#039;autres réseaux ==&lt;br /&gt;
&lt;br /&gt;
* [[https://www.universite-lyon.fr/| Université de Lyon]] L&#039;&#039;&#039;&#039;université de Lyon&#039;&#039;&#039; est une &#039;&#039;&#039;communauté d&#039;universités et établissements&#039;&#039;&#039; qui fédère onze établissements d’enseignement supérieur et de recherche de Lyon et Saint-Étienne ainsi que le CNRS, et a pour vocation de promouvoir la qualité des formations et des recherches menées en leur sein&lt;br /&gt;
* [[https://www.msh-lse.fr/| MSH-LSE]] la &#039;&#039;&#039;Maison des Sciences de l’Homme (MSH) Lyon St-Etienne&#039;&#039;&#039; rassemble maintenant 52 laboratoires de recherche implantés sur les deux sites. Au sein de cette structure, les expertises des chercheurs couvrent tout le spectre des SHS. De par son statut, la MSH travaille en collaboration avec le CNRS et les établissements d’enseignement supérieur et de recherche de la région. Elle joue ainsi un &#039;&#039;&#039;rôle fédérateur pour le développement de la recherche en SHS au sein de la COMUE Université de Lyon&#039;&#039;&#039;.&lt;br /&gt;
* [[http://bioenvis.universite-lyon.fr/| FR BioEnvis]] &#039;&#039;&#039;Fédération de Recherche&#039;&#039;&#039; regroupant plusieurs unités de recherche de la communauté scientifique lyonnaise, opérant dans le champ de la &#039;&#039;&#039;Biologie de l’environnement&#039;&#039;&#039; et de ses implications dans la domaine de la &#039;&#039;&#039;Santé globale&#039;&#039;&#039; (aussi bien humaine qu’animale ou végétale). Elle regroupe notamment les préoccupations agronomiques, vétérinaires ou de santé des environnements non anthropisés des unités membres.&lt;br /&gt;
* [[https://ecoleurbainedelyon.universite-lyon.fr/| Ecole Urbaine de Lyon]] L’&#039;&#039;&#039;École Urbaine de Lyon&#039;&#039;&#039; (EUL) est un programme « Institut Convergences » créé en juin 2017 dans le cadre du Plan d’Investissement d’Avenir (PIA2) par le Commissariat Général à l’Investissement (CGI). Elle est dirigée par Michel Lussault, Géographe, Professeur d’études urbaines à l’Ecole Normale Supérieure de Lyon (ENS). A travers son projet interdisciplinaire expérimental de recherche, de formation doctorale et de valorisation économique, sociale et culturelle des savoirs scientifiques, l’École Urbaine de Lyon innove en constituant un domaine nouveau de connaissance et d’expertise : l’&#039;&#039;&#039;urbain anthropocène&#039;&#039;&#039;.&lt;br /&gt;
* [[https://www.huma-num.fr/| huma-num]] &#039;&#039;&#039;Très Grande Infrastructure de Recherche des humanités numériques&#039;&#039;&#039; La principale mission de la TGIR Huma-Num est de construire, avec les communautés et à partir d’un pilotage scientifique, une infrastructure numérique de niveau international pour les SHS. Elle structure, par l’intermédiaire de consortiums regroupant des acteurs des communautés scientifiques et d’un réseau de points de présence dans les maisons des sciences de l’Homme (MSH), l’&#039;&#039;&#039;accompagnement des communautés scientifiques SHS en matière d’infrastructure numérique pour les données de la recherche&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== 🗺️ Côté SIG / spatial ===&lt;br /&gt;
&lt;br /&gt;
* [[http://gdr-magis.imag.fr/| GdR MAGIS]] Créé le 1er janvier 2009 et renouvelé en 2017 par le CNRS, le GdR MAGIS a pour missions 1) d’accompagner la recherche sur l’Information Géographique dans toute sa diversité, 2) de fédérer une communauté scientifique pluridisciplinaire en géomatique, 3) de diffuser les connaissances produites (résultats théoriques, méthodologiques et technologiques). Dans ce contexte, le GdR MAGIS développe 12 axes de recherches en géomatique et s’appuie notamment sur une compétence commune (la modélisation), une orientation forte (l’analyse spatiale), une approche partagée (l’interdisciplinarité).&lt;br /&gt;
=== 💧 Côté hydro / fluvial===&lt;br /&gt;
&lt;br /&gt;
* [[https://asso.graie.org/portail/| GRAIE]] &#039;&#039;&#039;Groupe de Recherche, Animation technique et Information sur l&#039;Eau&#039;&#039;&#039;. Il mobilise et met en relation des acteurs de la gestion de l&#039;eau.&lt;br /&gt;
: Dispositifs associés&lt;br /&gt;
:* [[https://www.zabr.assograie.org/| ZABR]] &#039;&#039;&#039;Zone Atelier Bassin du Rhône&#039;&#039;&#039;, dispositif scientifique d’observation du bassin du Rhône tourné vers les acteurs du territoire&lt;br /&gt;
:* [[https://ohm-vallee-du-rhone.in2p3.fr/| OHM VR]] L’&#039;&#039;&#039;Observatoire Homme-Milieux Vallée du Rhône&#039;&#039;&#039; est un dispositif de recherche créé en 2011 par l&#039;Institut « Écologie et Environnement » (InEE) du CNRS et inscrit dans le &#039;&#039;&#039;LabEx DRIIHM (Dispositif de Recherche Interdisciplinaire sur les Interactions Hommes-Milieux)&#039;&#039;&#039;.&lt;br /&gt;
:* [[http://www.graie.org/osr/| OSR]] L’&#039;&#039;&#039;Observatoire des Sédiments du Rhône&#039;&#039;&#039; (OSR) a été créé en 2009 à la suite de questions qui ont émergé dans le cadre du Plan Rhône. Il a été mis en place par des équipes de recherche réparties sur l’ensemble du linéaire du fleuve.&lt;br /&gt;
:* [[http://www.graie.org/othu/index.htm| OTHU]] &#039;&#039;&#039;Observatoire de Terrain en Hydrologie Urbaine&#039;&#039;&#039;. L&#039;OTHU est un laboratoire de recherche &amp;quot;hors murs&amp;quot; d&#039;&#039;&#039;&#039;observation des rejets urbains et de leurs impacts sur les milieux recepteurs - notamment par temps de pluie- sur la region lyonnaise &#039;&#039;&#039; pour proposer de nouvelles solutions de conception et de gestion de l&#039;assainissement. Cet observatoire a pour mission de produire, rassembler et gérer des données visant à caractériser les stocks et les flux sédimentaires, ainsi que les pollutions associées à ces sédiments. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Par discipline ou spécialité ==&lt;br /&gt;
&lt;br /&gt;
* Réseau Interdisciplinaire autour de la Statistique: [[https://ris.cnrs.fr/| RIS]] &lt;br /&gt;
* Réseau Méthodes Analyses Terrains Enquêtes en SHS [[https://mate-shs.cnrs.fr/| MATE-SHS]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les listes de diffusion &amp;quot;maison&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
* isig-support@listes.ens-lyon.fr&lt;br /&gt;
* info.evs.nord@listes.ens-lyon.fr&lt;br /&gt;
* hydrosystemes@listes.ens-lyon.fr&lt;br /&gt;
&lt;br /&gt;
== Les listes de diffusion autres ==&lt;br /&gt;
&lt;br /&gt;
* r-soc@groupes.renater.fr : Cette liste ouverte à tous a pour objet de faciliter les échanges, l&#039;aide et le support pour l&#039;&#039;&#039;&#039;utilisation du logiciel R en sciences sociales&#039;&#039;&#039;.&lt;br /&gt;
* reseau_stats@services.cnrs.fr (liste de diffusion du RIS)&lt;br /&gt;
[[Catégorie:Vie du laboratoire]]&lt;/div&gt;</summary>
		<author><name>88.126.37.20</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Questions-g%C3%A9n%C3%A9rales&amp;diff=58</id>
		<title>Questions-générales</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Questions-g%C3%A9n%C3%A9rales&amp;diff=58"/>
		<updated>2022-01-11T08:49:06Z</updated>

		<summary type="html">&lt;p&gt;88.126.37.20 : mise en forme texte Discord&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problème de lecture vidéo ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
Je veux lire des vidéos MP4 (que j&#039;ai moi-même enregistrées: j&#039;ai le choix de l&#039;encodage)&lt;br /&gt;
Mais quand je veux les lire pour voir si l&#039;enregistrement est OK, il me dit que j&#039;ai pas ce qu&#039;il faut pour lire la vidéo&lt;br /&gt;
en l&#039;occurrence il me demande le décodeur H.264&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
VLC&lt;br /&gt;
&lt;br /&gt;
apt install vlc&lt;br /&gt;
Clic droit &amp;gt; propriétés &amp;gt; Ouvrir avec&lt;br /&gt;
Tu sélectionne VLC et tu clique sur &amp;quot;définir par défaut&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Traductions, concepts, formulations==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Je cherche à exprimer l&#039;idée que les rivières les villes et le lien entre les deux ne sont pas que l&#039;objet de connaissances &amp;quot;physiques&amp;quot; ou &amp;quot;scientifiques&amp;quot; (sciences dures notamment) mais que ce sont aussi des objets &amp;quot;sociaux&amp;quot; qui font l&#039;objet de connaissances générales/culturelles/&amp;quot;citoyennes&amp;quot;/historiques.&lt;br /&gt;
Je sais pas du tout comment le dire (en anglais)&lt;br /&gt;
&lt;br /&gt;
Linked Open Data, on the other hand, could be an important (and generally overlooked) resource to characterize physical objects such as rivers or cities as items of citizen knowledge&lt;br /&gt;
mais &amp;quot;citizen knowledge&amp;quot; ça me va pas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de Marylise&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tu peux choisir l&#039;entrée socio-écosystèmes : dire qu&#039;ils ont à la fois une composante biophysique mais qu&#039;ils sont aussi construits par la société et qu&#039;ils sont appréhendés par le biais de perceptions, de représentations, de valeurs, d&#039;usages... &lt;br /&gt;
&lt;br /&gt;
Finalement:&lt;br /&gt;
&lt;br /&gt;
Linked Open Data, on the other hand, could be an important (and generally overlooked) resource to characterize objects such as rivers or cities not only as physical objects but also as socio-ecosystems subject to general human knowledge, values and uses as well as perception and representation.&lt;br /&gt;
&lt;br /&gt;
== Questions quant au fonctionnement du Discord ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
différence entre &amp;quot;bannir&amp;quot; et &amp;quot;expulser&amp;quot;?&lt;br /&gt;
Faut faire quoi avec les vieux comptes en double-triple?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de Julien Godfroy&#039;&#039;&#039;&lt;br /&gt;
Expulser, la personne peut revenir sans soucis.&lt;br /&gt;
Bannir, elle a besoin de faire un nouveau compte, et possiblement aussi changer son IP.&lt;br /&gt;
&lt;br /&gt;
=== Mise en forme du texte ===&lt;br /&gt;
&lt;br /&gt;
du md un peu simplifié&lt;br /&gt;
[[https://support.discord.com/hc/fr/articles/210298617-Bases-de-la-mise-en-forme-de-texte-Markdown-mise-en-forme-du-chat-gras-italique-soulign%C3%A9-|mise en page texte sur Discord]]&lt;br /&gt;
&lt;br /&gt;
== VPN ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pbs chez lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nécessité de réinstaller openvpn&lt;br /&gt;
&lt;br /&gt;
== Adobe + Ubuntu = 💔 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
comment signer un pdf avec le système de signatures digitalisées d&#039;Adobe&lt;br /&gt;
(et je crois pas que je puisse signer avec leur système sans Adobe)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour Adobe, oui c&#039;est la misère sous Linux 😢 Moi j&#039;utilise la version windows que je fais tourner avec Wine. Ca marche à peu près dans la plupart des cas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== installation des nouvelles imprimantes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pbs chez lvaudor, sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cannot change printer-is-shared for remote queues.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avis de Christine MN&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ca fonctionne pour moi mais je ne suis pas sous Ubuntu ...&lt;br /&gt;
[[https://intranet.ens-lyon.fr/documentation/impressions-et-copies-depuis-le-poste-de-travail|la procédure à suivre]]&lt;br /&gt;
&lt;br /&gt;
Fonctionne pas. Fix de sdunesme:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;J&#039;ai fini par mettre le pdf sur une clé et connecter la clé au copieur. C&#039;était il y a quelques mois, quand ils ont installé les imprimantes&lt;br /&gt;
La doc a peut-être évolué depuis (elle était inexistante pour les postes sous linux à l&#039;époque).&amp;quot; Solution également adoptée par Lise!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gitlab ISIG huma-num ==&lt;br /&gt;
&lt;br /&gt;
[[https://gitlab.huma-num.fr/evs/git_info|gitlab ISIG huma-num]] &lt;br /&gt;
&lt;br /&gt;
== Continuer à éditer cette page ==&lt;br /&gt;
&lt;br /&gt;
Dans Discord, channel questions-générales, faire&lt;br /&gt;
!saveconv 885051020248514570 888401199013982228&lt;/div&gt;</summary>
		<author><name>88.126.37.20</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Questions-g%C3%A9n%C3%A9rales&amp;diff=57</id>
		<title>Questions-générales</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Questions-g%C3%A9n%C3%A9rales&amp;diff=57"/>
		<updated>2022-01-11T08:43:33Z</updated>

		<summary type="html">&lt;p&gt;88.126.37.20 : ajout gitlab huma-num&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problème de lecture vidéo ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
Je veux lire des vidéos MP4 (que j&#039;ai moi-même enregistrées: j&#039;ai le choix de l&#039;encodage)&lt;br /&gt;
Mais quand je veux les lire pour voir si l&#039;enregistrement est OK, il me dit que j&#039;ai pas ce qu&#039;il faut pour lire la vidéo&lt;br /&gt;
en l&#039;occurrence il me demande le décodeur H.264&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
VLC&lt;br /&gt;
&lt;br /&gt;
apt install vlc&lt;br /&gt;
Clic droit &amp;gt; propriétés &amp;gt; Ouvrir avec&lt;br /&gt;
Tu sélectionne VLC et tu clique sur &amp;quot;définir par défaut&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Traductions, concepts, formulations==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Je cherche à exprimer l&#039;idée que les rivières les villes et le lien entre les deux ne sont pas que l&#039;objet de connaissances &amp;quot;physiques&amp;quot; ou &amp;quot;scientifiques&amp;quot; (sciences dures notamment) mais que ce sont aussi des objets &amp;quot;sociaux&amp;quot; qui font l&#039;objet de connaissances générales/culturelles/&amp;quot;citoyennes&amp;quot;/historiques.&lt;br /&gt;
Je sais pas du tout comment le dire (en anglais)&lt;br /&gt;
&lt;br /&gt;
Linked Open Data, on the other hand, could be an important (and generally overlooked) resource to characterize physical objects such as rivers or cities as items of citizen knowledge&lt;br /&gt;
mais &amp;quot;citizen knowledge&amp;quot; ça me va pas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de Marylise&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tu peux choisir l&#039;entrée socio-écosystèmes : dire qu&#039;ils ont à la fois une composante biophysique mais qu&#039;ils sont aussi construits par la société et qu&#039;ils sont appréhendés par le biais de perceptions, de représentations, de valeurs, d&#039;usages... &lt;br /&gt;
&lt;br /&gt;
Finalement:&lt;br /&gt;
&lt;br /&gt;
Linked Open Data, on the other hand, could be an important (and generally overlooked) resource to characterize objects such as rivers or cities not only as physical objects but also as socio-ecosystems subject to general human knowledge, values and uses as well as perception and representation.&lt;br /&gt;
&lt;br /&gt;
== Questions quant au fonctionnement du Discord ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
différence entre &amp;quot;bannir&amp;quot; et &amp;quot;expulser&amp;quot;?&lt;br /&gt;
Faut faire quoi avec les vieux comptes en double-triple?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de Julien Godfroy&#039;&#039;&#039;&lt;br /&gt;
Expulser, la personne peut revenir sans soucis.&lt;br /&gt;
Bannir, elle a besoin de faire un nouveau compte, et possiblement aussi changer son IP.&lt;br /&gt;
&lt;br /&gt;
== VPN ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pbs chez lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nécessité de réinstaller openvpn&lt;br /&gt;
&lt;br /&gt;
== Adobe + Ubuntu = 💔 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
comment signer un pdf avec le système de signatures digitalisées d&#039;Adobe&lt;br /&gt;
(et je crois pas que je puisse signer avec leur système sans Adobe)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour Adobe, oui c&#039;est la misère sous Linux 😢 Moi j&#039;utilise la version windows que je fais tourner avec Wine. Ca marche à peu près dans la plupart des cas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== installation des nouvelles imprimantes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pbs chez lvaudor, sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cannot change printer-is-shared for remote queues.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avis de Christine MN&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ca fonctionne pour moi mais je ne suis pas sous Ubuntu ...&lt;br /&gt;
[[https://intranet.ens-lyon.fr/documentation/impressions-et-copies-depuis-le-poste-de-travail|la procédure à suivre]]&lt;br /&gt;
&lt;br /&gt;
Fonctionne pas. Fix de sdunesme:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;J&#039;ai fini par mettre le pdf sur une clé et connecter la clé au copieur. C&#039;était il y a quelques mois, quand ils ont installé les imprimantes&lt;br /&gt;
La doc a peut-être évolué depuis (elle était inexistante pour les postes sous linux à l&#039;époque).&amp;quot; Solution également adoptée par Lise!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Gitlab ISIG huma-num ==&lt;br /&gt;
&lt;br /&gt;
[[https://gitlab.huma-num.fr/evs/git_info|gitlab ISIG huma-num]] &lt;br /&gt;
&lt;br /&gt;
== Continuer à éditer cette page ==&lt;br /&gt;
&lt;br /&gt;
Dans Discord, channel questions-générales, faire&lt;br /&gt;
!saveconv 885051020248514570 888401199013982228&lt;/div&gt;</summary>
		<author><name>88.126.37.20</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Questions-g%C3%A9n%C3%A9rales&amp;diff=56</id>
		<title>Questions-générales</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Questions-g%C3%A9n%C3%A9rales&amp;diff=56"/>
		<updated>2022-01-10T17:15:59Z</updated>

		<summary type="html">&lt;p&gt;88.126.37.20 : pour continuer l&amp;#039;édition&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problème de lecture vidéo ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
Je veux lire des vidéos MP4 (que j&#039;ai moi-même enregistrées: j&#039;ai le choix de l&#039;encodage)&lt;br /&gt;
Mais quand je veux les lire pour voir si l&#039;enregistrement est OK, il me dit que j&#039;ai pas ce qu&#039;il faut pour lire la vidéo&lt;br /&gt;
en l&#039;occurrence il me demande le décodeur H.264&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
VLC&lt;br /&gt;
&lt;br /&gt;
apt install vlc&lt;br /&gt;
Clic droit &amp;gt; propriétés &amp;gt; Ouvrir avec&lt;br /&gt;
Tu sélectionne VLC et tu clique sur &amp;quot;définir par défaut&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Traductions, concepts, formulations==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Je cherche à exprimer l&#039;idée que les rivières les villes et le lien entre les deux ne sont pas que l&#039;objet de connaissances &amp;quot;physiques&amp;quot; ou &amp;quot;scientifiques&amp;quot; (sciences dures notamment) mais que ce sont aussi des objets &amp;quot;sociaux&amp;quot; qui font l&#039;objet de connaissances générales/culturelles/&amp;quot;citoyennes&amp;quot;/historiques.&lt;br /&gt;
Je sais pas du tout comment le dire (en anglais)&lt;br /&gt;
&lt;br /&gt;
Linked Open Data, on the other hand, could be an important (and generally overlooked) resource to characterize physical objects such as rivers or cities as items of citizen knowledge&lt;br /&gt;
mais &amp;quot;citizen knowledge&amp;quot; ça me va pas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de Marylise&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tu peux choisir l&#039;entrée socio-écosystèmes : dire qu&#039;ils ont à la fois une composante biophysique mais qu&#039;ils sont aussi construits par la société et qu&#039;ils sont appréhendés par le biais de perceptions, de représentations, de valeurs, d&#039;usages... &lt;br /&gt;
&lt;br /&gt;
Finalement:&lt;br /&gt;
&lt;br /&gt;
Linked Open Data, on the other hand, could be an important (and generally overlooked) resource to characterize objects such as rivers or cities not only as physical objects but also as socio-ecosystems subject to general human knowledge, values and uses as well as perception and representation.&lt;br /&gt;
&lt;br /&gt;
== Questions quant au fonctionnement du Discord ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
différence entre &amp;quot;bannir&amp;quot; et &amp;quot;expulser&amp;quot;?&lt;br /&gt;
Faut faire quoi avec les vieux comptes en double-triple?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de Julien Godfroy&#039;&#039;&#039;&lt;br /&gt;
Expulser, la personne peut revenir sans soucis.&lt;br /&gt;
Bannir, elle a besoin de faire un nouveau compte, et possiblement aussi changer son IP.&lt;br /&gt;
&lt;br /&gt;
== VPN ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pbs chez lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nécessité de réinstaller openvpn&lt;br /&gt;
&lt;br /&gt;
== Adobe + Ubuntu = 💔 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
comment signer un pdf avec le système de signatures digitalisées d&#039;Adobe&lt;br /&gt;
(et je crois pas que je puisse signer avec leur système sans Adobe)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour Adobe, oui c&#039;est la misère sous Linux 😢 Moi j&#039;utilise la version windows que je fais tourner avec Wine. Ca marche à peu près dans la plupart des cas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== installation des nouvelles imprimantes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pbs chez lvaudor, sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cannot change printer-is-shared for remote queues.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avis de Christine MN&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ca fonctionne pour moi mais je ne suis pas sous Ubuntu ...&lt;br /&gt;
[[https://intranet.ens-lyon.fr/documentation/impressions-et-copies-depuis-le-poste-de-travail|la procédure à suivre]]&lt;br /&gt;
&lt;br /&gt;
Fonctionne pas. Fix de sdunesme:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;J&#039;ai fini par mettre le pdf sur une clé et connecter la clé au copieur. C&#039;était il y a quelques mois, quand ils ont installé les imprimantes&lt;br /&gt;
La doc a peut-être évolué depuis (elle était inexistante pour les postes sous linux à l&#039;époque).&amp;quot; Solution également adoptée par Lise!&lt;br /&gt;
&lt;br /&gt;
== Continuer à éditer cette page ==&lt;br /&gt;
&lt;br /&gt;
Dans Discord, channel questions-générales, faire&lt;br /&gt;
!saveconv 885051020248514570 888401199013982228&lt;/div&gt;</summary>
		<author><name>88.126.37.20</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Questions-r&amp;diff=55</id>
		<title>Questions-r</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Questions-r&amp;diff=55"/>
		<updated>2022-01-10T17:13:13Z</updated>

		<summary type="html">&lt;p&gt;88.126.37.20 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cette page reprend la &amp;quot;substantifique moelle&amp;quot; des échanges ayant eu lieu sur le channel &#039;&#039;&#039;questions-r&#039;&#039;&#039; du Discord d&#039;ISIG.&lt;br /&gt;
&lt;br /&gt;
== Manipulation d&#039;un nom de fichier ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question posée par martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Comment récupérer un morceau du nom du fichier ? Par exemple à partir de &#039;&#039;&#039;&amp;quot;zarsqdfqsfd33vezre20618402.csv&#039;&#039;&#039; on veut récupérer &#039;&#039;&#039;20618402&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor et sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Combi des &#039;&#039;&#039;expressions régulières&#039;&#039;&#039; et de la fonction &#039;&#039;&#039;basename()&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;za/rsqd/fqsfd33vezre20618402.csv&amp;quot; %&amp;gt;%&lt;br /&gt;
  basename() %&amp;gt;% # donne &amp;quot;fqsfd33vezre20618402.csv&amp;quot;&lt;br /&gt;
  stringr::str_replace(&amp;quot;.csv&amp;quot;,&amp;quot;&amp;quot;) %&amp;gt;% # donne &amp;quot;fqsfd33vezre20618402&amp;quot;&lt;br /&gt;
  stringr::str_extract(pattern=&amp;quot;.{8}(?=\\.$)&amp;quot;) # donne &amp;quot;20618402&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reformattage d&#039;un fichier en &amp;quot;longueur&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de mcottet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;ai une bdd avec plusieurs variables catégorielles qui portent une info similaire (est ce que les gens ont vu l&#039;espèce A un peu, bcp, passionnément, à la folie ; idem pour l&#039;espèce B, C...). Et j&#039;aimerais faire une somme pour savoir combien de fois l&#039;individu 1 a répondu un peu à l&#039;ensemble des espèces proposées, bcp à l&#039;ensemble des espèces...&lt;br /&gt;
il y a 18 espèces (donc 18 variables)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tidyr::pivot_longer()&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dans ta version de BDD, tu as 18 variables différentes&lt;br /&gt;
Mais en fait, tu pourrais considérer que ces 18 colonnes correspondent en fait à 2 colonnes (une colonne &amp;quot;espece&amp;quot; et une colonne &amp;quot;valeur&amp;quot;)&lt;br /&gt;
Tu cherches de ce fait à répéter l&#039;ensemble des autres colonnes (toutes celles qui ne font pas partie des 18 sus-mentionnées) 18 fois, mais &amp;quot;en hauteur&amp;quot;.&lt;br /&gt;
Du coup, ton tableau qui est &amp;quot;plutôt large&amp;quot; devient un tableau &amp;quot;plutôt long&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;appel à la fonction, tu précises quelles sont les variables que tu récupères pour les mettre &amp;quot;en long&amp;quot;&lt;br /&gt;
et toutes les autres, il les répète à l&#039;identique autant de fois que nécessaire&lt;br /&gt;
&lt;br /&gt;
A une époque, ça s&#039;appelait pas pivot_wider() et pivot_longer() mais spread() et gather()&lt;br /&gt;
(mais c&#039;était moins explicite comme nom)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;arrive à aller chercher différents fichiers excel et à les &amp;quot;rbind&amp;quot; avec ça :&lt;br /&gt;
temp_data &amp;lt;- list.files(path_to_files, pattern = &#039;*.xlsx&#039;) %&amp;gt;% &lt;br /&gt;
  purrr::map_dfr(~readxl::read_xlsx(paste0(path_to_files, .x)))&lt;br /&gt;
&lt;br /&gt;
Maintenant, chaque fichier contient un champ &amp;quot;date&amp;quot;... Comment pourrais-je faire pour qu&#039;au lieu de les ajouter à la suite les uns des autres, je les joignent par date ?&lt;br /&gt;
&lt;br /&gt;
J&#039;ai 15 fichiers excels, que, jusqu&#039;ici, je lis à la suite et colle les uns après les autres. Ce qu&#039;il me faudrait, à présent, c&#039;est une sorte de &#039;recast&#039; en fait, mais avec comme identifiant commun une variable lubridate. Pour qu&#039;au lieux d&#039;avoir une colonne qui m&#039;indique le nom du site (= le nom du fichier en entrée) et une autre une valeur de température, je me retrouve avec un tableau &#039;large&#039; avec comme nom de colonne chacune des stations contenant sa valeur de température.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de defuneste et sduneme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
do.call et/ou pivot_wider [[https://tidyr.tidyverse.org/articles/pivot.html#wider]]&lt;br /&gt;
&lt;br /&gt;
C&#039;est qu&#039;est ce que j&#039;avais essayé au départ, mais ça n&#039;marchait pas...&lt;br /&gt;
Parce que j&#039;avais une variable &#039;id&#039; qui empêchait le regroupement de se faire correctement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
df %&amp;gt;% &lt;br /&gt;
  select(timestamp, station, temperature) %&amp;gt;%&lt;br /&gt;
  pivot_wider(names_from=station, values_from=temperature)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution non-purrr&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Chargement des library / installation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
# install.packages(&amp;quot;tidyverse&amp;quot;)&lt;br /&gt;
# install.packages(&amp;quot;readxl&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# les données sont dans un répertoire enfant:&lt;br /&gt;
&lt;br /&gt;
file_path &amp;lt;- list.files(path = &amp;quot;data&amp;quot;,&lt;br /&gt;
                        pattern = &amp;quot;*.xlsx&amp;quot;,&lt;br /&gt;
                        full.names =  TRUE) # pas mal pour t&#039;economiser un paste0&lt;br /&gt;
&lt;br /&gt;
# une fonction qui lis un xlss&lt;br /&gt;
lis_un_fichier_excel &amp;lt;- function(un_chemin_de_fichier) { &lt;br /&gt;
                                  readxl::read_xlsx(un_chemin_de_fichier)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# on teste&lt;br /&gt;
lis_un_fichier_excel(file_path[1])&lt;br /&gt;
&lt;br /&gt;
# une liste de df&lt;br /&gt;
une_liste_de_tableau &amp;lt;- lapply(file_path, &amp;quot;lis_un_fichier_excel&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# on ajoute les lignes&lt;br /&gt;
mon_tableau_en_tidy &amp;lt;- do.call(&amp;quot;rbind&amp;quot;, une_liste_de_tableau)&lt;br /&gt;
mon_tableau_en_tidy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complétion des données d&#039;une série temporelle ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de Théo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
j&#039;ai une série temporelle de hauteurs d&#039;eau à pas de temps 15 min, mais il y a plein de trous dedans et je voudrais la compléter, en ajoutant l&#039;heure manquante, et la hauteur d&#039;eau manquante (moyenne de t-15 et t+15 si t est la valeur manquante). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
il faut que tu commences par te créer un index de temps à l&#039;intervalle voulu, depuis ta première valeur jusqu&#039;à la dernière, à laquelle tu joins ton jeu de données réel. Les trous vont alors apparaître en &#039;NA&#039;. Et si tu n&#039;as que quelques trous de jamais plus de 2 intervalles, tu peux utiliser la fonction zoo::na_approx() qui fera l&#039;affaire...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(dplyr)&lt;br /&gt;
H_15_raw = readr::read_delim(&amp;quot;H_15MIN_SB_CSV.csv&amp;quot;, delim = &amp;quot;;&amp;quot;) %&amp;gt;% &lt;br /&gt;
  mutate(Date = lubridate::dmy_hm(Date))&lt;br /&gt;
&lt;br /&gt;
timestamp = seq(from = min(H_15_raw$Date), to = max(H_15_raw$Date), by = &amp;quot;15 min&amp;quot;) %&amp;gt;% &lt;br /&gt;
  as_tibble() %&amp;gt;% &lt;br /&gt;
  select(Date = value)&lt;br /&gt;
&lt;br /&gt;
H_15_corr =&lt;br /&gt;
  left_join(timestamp, H_15_raw, by =&amp;quot;Date&amp;quot;) %&amp;gt;% &lt;br /&gt;
  mutate(H_CM_SB_BH = zoo::na.approx(H_CM_SB_BH))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regarde ?na.approx pour plus de détails sur son fonctionnement&lt;br /&gt;
&lt;br /&gt;
== Programmation fonctionnelle ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;ai un jeu de données avec des températures à pas de temps horaire, le tout sur plusieurs années (et plusieurs stations). J&#039;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&#039;aurais créé un nouveau champ pour lequel j&#039;incrémente une valeur de séquence à chaque fois que T&amp;gt;19 et que T-1&amp;lt;19. Je regarde la valeur max de ma séquence, et la longueur max de ces séquences également. Mais comment faire sans boucle ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
get_sequences=function(donnees, Temp){&lt;br /&gt;
  result = donnees %&amp;gt;% &lt;br /&gt;
    mutate(change = case_when(chmes_valeur &amp;gt; Temp &amp;amp; lag(chmes_valeur &amp;lt;= Temp) ~ 1,&lt;br /&gt;
                              TRUE ~ 0)) %&amp;gt;% &lt;br /&gt;
    mutate(sequence = case_when(chmes_valeur &amp;gt; Temp ~ cumsum(as.numeric(change)),&lt;br /&gt;
                                TRUE ~ NA_real_))&lt;br /&gt;
  return(result)&lt;br /&gt;
}&lt;br /&gt;
result= dat %&amp;gt;% &lt;br /&gt;
  group_by(chmes_coderhj,chmes_anneebiol) %&amp;gt;% &lt;br /&gt;
  tidyr::nest() %&amp;gt;% &lt;br /&gt;
  mutate(data=purrr::map(data,get_sequences,Temp=19)) %&amp;gt;% &lt;br /&gt;
  tidyr::unnest(cols=c(data))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou bien (autre syntaxe possible pour map), comme ça:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
result= dat %&amp;gt;% &lt;br /&gt;
  group_by(chmes_coderhj,chmes_anneebiol) %&amp;gt;% &lt;br /&gt;
  tidyr::nest() %&amp;gt;% &lt;br /&gt;
  mutate(data=purrr::map(data,~get_sequences(.,Temp=19))) %&amp;gt;% &lt;br /&gt;
  tidyr::unnest(cols=c(data))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Différence entre avec et sans &#039;~&#039; devant la fonction:&lt;br /&gt;
&lt;br /&gt;
* soit map attend le nom d&#039;une fonction&lt;br /&gt;
: Dans ce cas l&#039;argument sur lequel il itère doit être le premier argument de la fonction&lt;br /&gt;
* soit map attend une formule (précédée d&#039;un &amp;quot;~&amp;quot;, donc)&lt;br /&gt;
: Dans ce cas il y a un peu plus de souplesse sur la position de l&#039;argument sur lequel on itère&lt;br /&gt;
&lt;br /&gt;
Tu pourrais dire ~ get_sequences(data, Temp=.) pour itérer sur une variable qui donnerait un seuil de température, par exemple&lt;br /&gt;
et non plus itérer sur le premier argument, &amp;quot;data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Si tu donnes le nom de la fonction, tu peux quand-même rajouter des arguments &amp;quot;secondaires&amp;quot;&lt;br /&gt;
mais tu les rajoutes directement comme arguments optionnels à la fonction &amp;quot;map&amp;quot;, pas dans un simulacre d&#039;appel à la fonction que tu itères&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation des formules c&#039;est un subtilité introduite pour gérer les fonctions qui n&#039;ont pas les arguments &amp;quot;dans l&#039;ordre le plus pratique au regard de ce qu&#039;on souhaite faire&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question complémentaire&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
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&#039;inclure dans la fct &#039;get_sequences&#039;, ou de repartir des résultats de cette fonction et d&#039;alimenter une nouvelle ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Réponse &#039;&#039;&#039;&lt;br /&gt;
Le nombre de total de séquences et la durée de la séquence la plus longue, ce sont des &amp;quot;agrégations&amp;quot; de ce que tu as fait avant. Or, il est possible que tu veuilles utiliser les résultats de get_sequences tels quels (par exemple pour des graphiques). Donc il vaut mieux faire en sorte que cette agrégation ait lieu dans un second temps =&amp;gt; définition d&#039;une nouvelle fonction par exemple. &lt;br /&gt;
&lt;br /&gt;
En revanche, je pense que tu pourrais faire tourner ce calcul avant de &amp;quot;unnest&amp;quot; car tes séquences n&#039;ont pas des identifiants uniques en l&#039;état (les identifiants ne sont uniques que au sein des sous-jeux de données imbriqués)&lt;br /&gt;
&lt;br /&gt;
avec n_distinct, je chope le nb total de séquences&lt;br /&gt;
Pour choper la durée de la séquence la plus longue, tu suggérerais quoi ?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
... %&amp;gt;% &lt;br /&gt;
  group_by(sequence) %&amp;gt;%&lt;br /&gt;
  summarise(duration=max(time)-min(time)) %&amp;gt;%&lt;br /&gt;
  ungroup() %&amp;gt;%&lt;br /&gt;
  mutate(n_sequences=n()) %&amp;gt;%&lt;br /&gt;
  top_n(1,duration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le mutate (n_sequences=n()) te rajoute le nombre de séquences sans résumer (ça répète autant de fois que nécessaire la valeur n_sequences)&lt;br /&gt;
du coup après quand tu gardes que la top duration t&#039;as quand-même l&#039;info qu&#039;il te faut.&lt;br /&gt;
&lt;br /&gt;
== Annonces de nouveau packages R ==&lt;br /&gt;
&lt;br /&gt;
=== banqueHydro === &lt;br /&gt;
&lt;br /&gt;
[[https://github.com/lvaudor/banqueHydro]]&lt;br /&gt;
&lt;br /&gt;
Pour &amp;quot;scraper&amp;quot; les données du site banqueHydro (en attendant l&#039;API Hubeau [[https://github.com/BRGM/hubeau/projects]]).&lt;br /&gt;
&lt;br /&gt;
== Annonces de formations/tutos/conf ==&lt;br /&gt;
&lt;br /&gt;
 * [[https://sigr2021.github.io/site/index.html|supports SIGR]] recommandé par defuneste&lt;br /&gt;
 * [[https://blog.sellorm.com/2017/12/18/learn-to-write-command-line-utilities-in-r/|billet command line utilities in R]] recommandé par defuneste&lt;br /&gt;
 * [[https://geocompr.robinlovelace.net/|geocomputation with R]] recommandé par defuneste&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Continuer l&#039;édition ==&lt;br /&gt;
&lt;br /&gt;
sur Discord, channel questions-r:&lt;br /&gt;
&lt;br /&gt;
!saveconv 882172361246396427 883000807585374258&lt;/div&gt;</summary>
		<author><name>88.126.37.20</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Questions-r&amp;diff=54</id>
		<title>Questions-r</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Questions-r&amp;diff=54"/>
		<updated>2022-01-10T17:10:51Z</updated>

		<summary type="html">&lt;p&gt;88.126.37.20 : add geocomputation with R&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cette page reprend la &amp;quot;substantifique moelle&amp;quot; des échanges ayant eu lieu sur le channel &#039;&#039;&#039;questions-r&#039;&#039;&#039; du Discord d&#039;ISIG.&lt;br /&gt;
&lt;br /&gt;
== Manipulation d&#039;un nom de fichier ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question posée par martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Comment récupérer un morceau du nom du fichier ? Par exemple à partir de &#039;&#039;&#039;&amp;quot;zarsqdfqsfd33vezre20618402.csv&#039;&#039;&#039; on veut récupérer &#039;&#039;&#039;20618402&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor et sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Combi des &#039;&#039;&#039;expressions régulières&#039;&#039;&#039; et de la fonction &#039;&#039;&#039;basename()&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;za/rsqd/fqsfd33vezre20618402.csv&amp;quot; %&amp;gt;%&lt;br /&gt;
  basename() %&amp;gt;% # donne &amp;quot;fqsfd33vezre20618402.csv&amp;quot;&lt;br /&gt;
  stringr::str_replace(&amp;quot;.csv&amp;quot;,&amp;quot;&amp;quot;) %&amp;gt;% # donne &amp;quot;fqsfd33vezre20618402&amp;quot;&lt;br /&gt;
  stringr::str_extract(pattern=&amp;quot;.{8}(?=\\.$)&amp;quot;) # donne &amp;quot;20618402&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reformattage d&#039;un fichier en &amp;quot;longueur&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de mcottet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;ai une bdd avec plusieurs variables catégorielles qui portent une info similaire (est ce que les gens ont vu l&#039;espèce A un peu, bcp, passionnément, à la folie ; idem pour l&#039;espèce B, C...). Et j&#039;aimerais faire une somme pour savoir combien de fois l&#039;individu 1 a répondu un peu à l&#039;ensemble des espèces proposées, bcp à l&#039;ensemble des espèces...&lt;br /&gt;
il y a 18 espèces (donc 18 variables)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tidyr::pivot_longer()&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dans ta version de BDD, tu as 18 variables différentes&lt;br /&gt;
Mais en fait, tu pourrais considérer que ces 18 colonnes correspondent en fait à 2 colonnes (une colonne &amp;quot;espece&amp;quot; et une colonne &amp;quot;valeur&amp;quot;)&lt;br /&gt;
Tu cherches de ce fait à répéter l&#039;ensemble des autres colonnes (toutes celles qui ne font pas partie des 18 sus-mentionnées) 18 fois, mais &amp;quot;en hauteur&amp;quot;.&lt;br /&gt;
Du coup, ton tableau qui est &amp;quot;plutôt large&amp;quot; devient un tableau &amp;quot;plutôt long&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;appel à la fonction, tu précises quelles sont les variables que tu récupères pour les mettre &amp;quot;en long&amp;quot;&lt;br /&gt;
et toutes les autres, il les répète à l&#039;identique autant de fois que nécessaire&lt;br /&gt;
&lt;br /&gt;
A une époque, ça s&#039;appelait pas pivot_wider() et pivot_longer() mais spread() et gather()&lt;br /&gt;
(mais c&#039;était moins explicite comme nom)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;arrive à aller chercher différents fichiers excel et à les &amp;quot;rbind&amp;quot; avec ça :&lt;br /&gt;
temp_data &amp;lt;- list.files(path_to_files, pattern = &#039;*.xlsx&#039;) %&amp;gt;% &lt;br /&gt;
  purrr::map_dfr(~readxl::read_xlsx(paste0(path_to_files, .x)))&lt;br /&gt;
&lt;br /&gt;
Maintenant, chaque fichier contient un champ &amp;quot;date&amp;quot;... Comment pourrais-je faire pour qu&#039;au lieu de les ajouter à la suite les uns des autres, je les joignent par date ?&lt;br /&gt;
&lt;br /&gt;
J&#039;ai 15 fichiers excels, que, jusqu&#039;ici, je lis à la suite et colle les uns après les autres. Ce qu&#039;il me faudrait, à présent, c&#039;est une sorte de &#039;recast&#039; en fait, mais avec comme identifiant commun une variable lubridate. Pour qu&#039;au lieux d&#039;avoir une colonne qui m&#039;indique le nom du site (= le nom du fichier en entrée) et une autre une valeur de température, je me retrouve avec un tableau &#039;large&#039; avec comme nom de colonne chacune des stations contenant sa valeur de température.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de defuneste et sduneme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
do.call et/ou pivot_wider [[https://tidyr.tidyverse.org/articles/pivot.html#wider]]&lt;br /&gt;
&lt;br /&gt;
C&#039;est qu&#039;est ce que j&#039;avais essayé au départ, mais ça n&#039;marchait pas...&lt;br /&gt;
Parce que j&#039;avais une variable &#039;id&#039; qui empêchait le regroupement de se faire correctement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
df %&amp;gt;% &lt;br /&gt;
  select(timestamp, station, temperature) %&amp;gt;%&lt;br /&gt;
  pivot_wider(names_from=station, values_from=temperature)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution non-purrr&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Chargement des library / installation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
# install.packages(&amp;quot;tidyverse&amp;quot;)&lt;br /&gt;
# install.packages(&amp;quot;readxl&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# les données sont dans un répertoire enfant:&lt;br /&gt;
&lt;br /&gt;
file_path &amp;lt;- list.files(path = &amp;quot;data&amp;quot;,&lt;br /&gt;
                        pattern = &amp;quot;*.xlsx&amp;quot;,&lt;br /&gt;
                        full.names =  TRUE) # pas mal pour t&#039;economiser un paste0&lt;br /&gt;
&lt;br /&gt;
# une fonction qui lis un xlss&lt;br /&gt;
lis_un_fichier_excel &amp;lt;- function(un_chemin_de_fichier) { &lt;br /&gt;
                                  readxl::read_xlsx(un_chemin_de_fichier)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# on teste&lt;br /&gt;
lis_un_fichier_excel(file_path[1])&lt;br /&gt;
&lt;br /&gt;
# une liste de df&lt;br /&gt;
une_liste_de_tableau &amp;lt;- lapply(file_path, &amp;quot;lis_un_fichier_excel&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# on ajoute les lignes&lt;br /&gt;
mon_tableau_en_tidy &amp;lt;- do.call(&amp;quot;rbind&amp;quot;, une_liste_de_tableau)&lt;br /&gt;
mon_tableau_en_tidy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complétion des données d&#039;une série temporelle ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de Théo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
j&#039;ai une série temporelle de hauteurs d&#039;eau à pas de temps 15 min, mais il y a plein de trous dedans et je voudrais la compléter, en ajoutant l&#039;heure manquante, et la hauteur d&#039;eau manquante (moyenne de t-15 et t+15 si t est la valeur manquante). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
il faut que tu commences par te créer un index de temps à l&#039;intervalle voulu, depuis ta première valeur jusqu&#039;à la dernière, à laquelle tu joins ton jeu de données réel. Les trous vont alors apparaître en &#039;NA&#039;. Et si tu n&#039;as que quelques trous de jamais plus de 2 intervalles, tu peux utiliser la fonction zoo::na_approx() qui fera l&#039;affaire...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(dplyr)&lt;br /&gt;
H_15_raw = readr::read_delim(&amp;quot;H_15MIN_SB_CSV.csv&amp;quot;, delim = &amp;quot;;&amp;quot;) %&amp;gt;% &lt;br /&gt;
  mutate(Date = lubridate::dmy_hm(Date))&lt;br /&gt;
&lt;br /&gt;
timestamp = seq(from = min(H_15_raw$Date), to = max(H_15_raw$Date), by = &amp;quot;15 min&amp;quot;) %&amp;gt;% &lt;br /&gt;
  as_tibble() %&amp;gt;% &lt;br /&gt;
  select(Date = value)&lt;br /&gt;
&lt;br /&gt;
H_15_corr =&lt;br /&gt;
  left_join(timestamp, H_15_raw, by =&amp;quot;Date&amp;quot;) %&amp;gt;% &lt;br /&gt;
  mutate(H_CM_SB_BH = zoo::na.approx(H_CM_SB_BH))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regarde ?na.approx pour plus de détails sur son fonctionnement&lt;br /&gt;
&lt;br /&gt;
== Programmation fonctionnelle ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;ai un jeu de données avec des températures à pas de temps horaire, le tout sur plusieurs années (et plusieurs stations). J&#039;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&#039;aurais créé un nouveau champ pour lequel j&#039;incrémente une valeur de séquence à chaque fois que T&amp;gt;19 et que T-1&amp;lt;19. Je regarde la valeur max de ma séquence, et la longueur max de ces séquences également. Mais comment faire sans boucle ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
get_sequences=function(donnees, Temp){&lt;br /&gt;
  result = donnees %&amp;gt;% &lt;br /&gt;
    mutate(change = case_when(chmes_valeur &amp;gt; Temp &amp;amp; lag(chmes_valeur &amp;lt;= Temp) ~ 1,&lt;br /&gt;
                              TRUE ~ 0)) %&amp;gt;% &lt;br /&gt;
    mutate(sequence = case_when(chmes_valeur &amp;gt; Temp ~ cumsum(as.numeric(change)),&lt;br /&gt;
                                TRUE ~ NA_real_))&lt;br /&gt;
  return(result)&lt;br /&gt;
}&lt;br /&gt;
result= dat %&amp;gt;% &lt;br /&gt;
  group_by(chmes_coderhj,chmes_anneebiol) %&amp;gt;% &lt;br /&gt;
  tidyr::nest() %&amp;gt;% &lt;br /&gt;
  mutate(data=purrr::map(data,get_sequences,Temp=19)) %&amp;gt;% &lt;br /&gt;
  tidyr::unnest(cols=c(data))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou bien (autre syntaxe possible pour map), comme ça:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
result= dat %&amp;gt;% &lt;br /&gt;
  group_by(chmes_coderhj,chmes_anneebiol) %&amp;gt;% &lt;br /&gt;
  tidyr::nest() %&amp;gt;% &lt;br /&gt;
  mutate(data=purrr::map(data,~get_sequences(.,Temp=19))) %&amp;gt;% &lt;br /&gt;
  tidyr::unnest(cols=c(data))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Différence entre avec et sans &#039;~&#039; devant la fonction:&lt;br /&gt;
&lt;br /&gt;
* soit map attend le nom d&#039;une fonction&lt;br /&gt;
: Dans ce cas l&#039;argument sur lequel il itère doit être le premier argument de la fonction&lt;br /&gt;
* soit map attend une formule (précédée d&#039;un &amp;quot;~&amp;quot;, donc)&lt;br /&gt;
: Dans ce cas il y a un peu plus de souplesse sur la position de l&#039;argument sur lequel on itère&lt;br /&gt;
&lt;br /&gt;
Tu pourrais dire ~ get_sequences(data, Temp=.) pour itérer sur une variable qui donnerait un seuil de température, par exemple&lt;br /&gt;
et non plus itérer sur le premier argument, &amp;quot;data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Si tu donnes le nom de la fonction, tu peux quand-même rajouter des arguments &amp;quot;secondaires&amp;quot;&lt;br /&gt;
mais tu les rajoutes directement comme arguments optionnels à la fonction &amp;quot;map&amp;quot;, pas dans un simulacre d&#039;appel à la fonction que tu itères&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation des formules c&#039;est un subtilité introduite pour gérer les fonctions qui n&#039;ont pas les arguments &amp;quot;dans l&#039;ordre le plus pratique au regard de ce qu&#039;on souhaite faire&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question complémentaire&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
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&#039;inclure dans la fct &#039;get_sequences&#039;, ou de repartir des résultats de cette fonction et d&#039;alimenter une nouvelle ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Réponse &#039;&#039;&#039;&lt;br /&gt;
Le nombre de total de séquences et la durée de la séquence la plus longue, ce sont des &amp;quot;agrégations&amp;quot; de ce que tu as fait avant. Or, il est possible que tu veuilles utiliser les résultats de get_sequences tels quels (par exemple pour des graphiques). Donc il vaut mieux faire en sorte que cette agrégation ait lieu dans un second temps =&amp;gt; définition d&#039;une nouvelle fonction par exemple. &lt;br /&gt;
&lt;br /&gt;
En revanche, je pense que tu pourrais faire tourner ce calcul avant de &amp;quot;unnest&amp;quot; car tes séquences n&#039;ont pas des identifiants uniques en l&#039;état (les identifiants ne sont uniques que au sein des sous-jeux de données imbriqués)&lt;br /&gt;
&lt;br /&gt;
avec n_distinct, je chope le nb total de séquences&lt;br /&gt;
Pour choper la durée de la séquence la plus longue, tu suggérerais quoi ?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
... %&amp;gt;% &lt;br /&gt;
  group_by(sequence) %&amp;gt;%&lt;br /&gt;
  summarise(duration=max(time)-min(time)) %&amp;gt;%&lt;br /&gt;
  ungroup() %&amp;gt;%&lt;br /&gt;
  mutate(n_sequences=n()) %&amp;gt;%&lt;br /&gt;
  top_n(1,duration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le mutate (n_sequences=n()) te rajoute le nombre de séquences sans résumer (ça répète autant de fois que nécessaire la valeur n_sequences)&lt;br /&gt;
du coup après quand tu gardes que la top duration t&#039;as quand-même l&#039;info qu&#039;il te faut.&lt;br /&gt;
&lt;br /&gt;
== Annonces de nouveau packages R ==&lt;br /&gt;
&lt;br /&gt;
=== banqueHydro === &lt;br /&gt;
&lt;br /&gt;
[[https://github.com/lvaudor/banqueHydro]]&lt;br /&gt;
&lt;br /&gt;
Pour &amp;quot;scraper&amp;quot; les données du site banqueHydro (en attendant l&#039;API Hubeau [[https://github.com/BRGM/hubeau/projects]]).&lt;br /&gt;
&lt;br /&gt;
== Annonces de formations/tutos/conf ==&lt;br /&gt;
 * [[https://sigr2021.github.io/site/index.html|supports SIGR]] recommandé par defuneste&lt;br /&gt;
 * [[https://blog.sellorm.com/2017/12/18/learn-to-write-command-line-utilities-in-r/|billet command line utilities in R]] recommandé par defuneste&lt;br /&gt;
 * [[https://geocompr.robinlovelace.net/index.html|geocomputation with R]] recommandé par defuneste&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Continuer l&#039;édition ==&lt;br /&gt;
&lt;br /&gt;
sur Discord, channel questions-r:&lt;br /&gt;
&lt;br /&gt;
!saveconv 882172361246396427 883000807585374258&lt;/div&gt;</summary>
		<author><name>88.126.37.20</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Questions-g%C3%A9n%C3%A9rales&amp;diff=53</id>
		<title>Questions-générales</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Questions-g%C3%A9n%C3%A9rales&amp;diff=53"/>
		<updated>2022-01-10T17:06:04Z</updated>

		<summary type="html">&lt;p&gt;88.126.37.20 : pb vpn , adobe, imprimantes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problème de lecture vidéo ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
Je veux lire des vidéos MP4 (que j&#039;ai moi-même enregistrées: j&#039;ai le choix de l&#039;encodage)&lt;br /&gt;
Mais quand je veux les lire pour voir si l&#039;enregistrement est OK, il me dit que j&#039;ai pas ce qu&#039;il faut pour lire la vidéo&lt;br /&gt;
en l&#039;occurrence il me demande le décodeur H.264&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
VLC&lt;br /&gt;
&lt;br /&gt;
apt install vlc&lt;br /&gt;
Clic droit &amp;gt; propriétés &amp;gt; Ouvrir avec&lt;br /&gt;
Tu sélectionne VLC et tu clique sur &amp;quot;définir par défaut&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Traductions, concepts, formulations==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Je cherche à exprimer l&#039;idée que les rivières les villes et le lien entre les deux ne sont pas que l&#039;objet de connaissances &amp;quot;physiques&amp;quot; ou &amp;quot;scientifiques&amp;quot; (sciences dures notamment) mais que ce sont aussi des objets &amp;quot;sociaux&amp;quot; qui font l&#039;objet de connaissances générales/culturelles/&amp;quot;citoyennes&amp;quot;/historiques.&lt;br /&gt;
Je sais pas du tout comment le dire (en anglais)&lt;br /&gt;
&lt;br /&gt;
Linked Open Data, on the other hand, could be an important (and generally overlooked) resource to characterize physical objects such as rivers or cities as items of citizen knowledge&lt;br /&gt;
mais &amp;quot;citizen knowledge&amp;quot; ça me va pas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de Marylise&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tu peux choisir l&#039;entrée socio-écosystèmes : dire qu&#039;ils ont à la fois une composante biophysique mais qu&#039;ils sont aussi construits par la société et qu&#039;ils sont appréhendés par le biais de perceptions, de représentations, de valeurs, d&#039;usages... &lt;br /&gt;
&lt;br /&gt;
Finalement:&lt;br /&gt;
&lt;br /&gt;
Linked Open Data, on the other hand, could be an important (and generally overlooked) resource to characterize objects such as rivers or cities not only as physical objects but also as socio-ecosystems subject to general human knowledge, values and uses as well as perception and representation.&lt;br /&gt;
&lt;br /&gt;
== Questions quant au fonctionnement du Discord ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
différence entre &amp;quot;bannir&amp;quot; et &amp;quot;expulser&amp;quot;?&lt;br /&gt;
Faut faire quoi avec les vieux comptes en double-triple?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de Julien Godfroy&#039;&#039;&#039;&lt;br /&gt;
Expulser, la personne peut revenir sans soucis.&lt;br /&gt;
Bannir, elle a besoin de faire un nouveau compte, et possiblement aussi changer son IP.&lt;br /&gt;
&lt;br /&gt;
== VPN ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;pbs chez lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nécessité de réinstaller openvpn&lt;br /&gt;
&lt;br /&gt;
== Adobe + Ubuntu = 💔 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
comment signer un pdf avec le système de signatures digitalisées d&#039;Adobe&lt;br /&gt;
(et je crois pas que je puisse signer avec leur système sans Adobe)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour Adobe, oui c&#039;est la misère sous Linux 😢 Moi j&#039;utilise la version windows que je fais tourner avec Wine. Ca marche à peu près dans la plupart des cas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== installation des nouvelles imprimantes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pbs chez lvaudor, sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cannot change printer-is-shared for remote queues.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Avis de Christine MN&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ca fonctionne pour moi mais je ne suis pas sous Ubuntu ...&lt;br /&gt;
[[https://intranet.ens-lyon.fr/documentation/impressions-et-copies-depuis-le-poste-de-travail|la procédure à suivre]]&lt;br /&gt;
&lt;br /&gt;
Fonctionne pas. Fix de sdunesme:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;J&#039;ai fini par mettre le pdf sur une clé et connecter la clé au copieur. C&#039;était il y a quelques mois, quand ils ont installé les imprimantes&lt;br /&gt;
La doc a peut-être évolué depuis (elle était inexistante pour les postes sous linux à l&#039;époque).&amp;quot; Solution également adoptée par Lise!&lt;/div&gt;</summary>
		<author><name>88.126.37.20</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Questions-g%C3%A9n%C3%A9rales&amp;diff=52</id>
		<title>Questions-générales</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Questions-g%C3%A9n%C3%A9rales&amp;diff=52"/>
		<updated>2022-01-10T16:52:34Z</updated>

		<summary type="html">&lt;p&gt;88.126.37.20 : Ajout reformulation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problème de lecture vidéo ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
Je veux lire des vidéos MP4 (que j&#039;ai moi-même enregistrées: j&#039;ai le choix de l&#039;encodage)&lt;br /&gt;
Mais quand je veux les lire pour voir si l&#039;enregistrement est OK, il me dit que j&#039;ai pas ce qu&#039;il faut pour lire la vidéo&lt;br /&gt;
en l&#039;occurrence il me demande le décodeur H.264&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
VLC&lt;br /&gt;
&lt;br /&gt;
apt install vlc&lt;br /&gt;
Clic droit &amp;gt; propriétés &amp;gt; Ouvrir avec&lt;br /&gt;
Tu sélectionne VLC et tu clique sur &amp;quot;définir par défaut&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Traductions, concepts, formulations==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Je cherche à exprimer l&#039;idée que les rivières les villes et le lien entre les deux ne sont pas que l&#039;objet de connaissances &amp;quot;physiques&amp;quot; ou &amp;quot;scientifiques&amp;quot; (sciences dures notamment) mais que ce sont aussi des objets &amp;quot;sociaux&amp;quot; qui font l&#039;objet de connaissances générales/culturelles/&amp;quot;citoyennes&amp;quot;/historiques.&lt;br /&gt;
Je sais pas du tout comment le dire (en anglais)&lt;br /&gt;
&lt;br /&gt;
Linked Open Data, on the other hand, could be an important (and generally overlooked) resource to characterize physical objects such as rivers or cities as items of citizen knowledge&lt;br /&gt;
mais &amp;quot;citizen knowledge&amp;quot; ça me va pas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de Marylise&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tu peux choisir l&#039;entrée socio-écosystèmes : dire qu&#039;ils ont à la fois une composante biophysique mais qu&#039;ils sont aussi construits par la société et qu&#039;ils sont appréhendés par le biais de perceptions, de représentations, de valeurs, d&#039;usages... &lt;br /&gt;
&lt;br /&gt;
Finalement:&lt;br /&gt;
&lt;br /&gt;
Linked Open Data, on the other hand, could be an important (and generally overlooked) resource to characterize objects such as rivers or cities not only as physical objects but also as socio-ecosystems subject to general human knowledge, values and uses as well as perception and representation.&lt;/div&gt;</summary>
		<author><name>88.126.37.20</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Questions-g%C3%A9n%C3%A9rales&amp;diff=51</id>
		<title>Questions-générales</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Questions-g%C3%A9n%C3%A9rales&amp;diff=51"/>
		<updated>2022-01-10T16:40:49Z</updated>

		<summary type="html">&lt;p&gt;88.126.37.20 : pb video codecs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Problème de lecture vidéo ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de lvaudor&#039;&#039;&#039;&lt;br /&gt;
Je veux lire des vidéos MP4 (que j&#039;ai moi-même enregistrées: j&#039;ai le choix de l&#039;encodage)&lt;br /&gt;
Mais quand je veux les lire pour voir si l&#039;enregistrement est OK, il me dit que j&#039;ai pas ce qu&#039;il faut pour lire la vidéo&lt;br /&gt;
en l&#039;occurrence il me demande le décodeur H.264&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
VLC&lt;br /&gt;
&lt;br /&gt;
apt install vlc&lt;br /&gt;
Clic droit &amp;gt; propriétés &amp;gt; Ouvrir avec&lt;br /&gt;
Tu sélectionne VLC et tu clique sur &amp;quot;définir par défaut&amp;quot;&lt;/div&gt;</summary>
		<author><name>88.126.37.20</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Questions-r&amp;diff=50</id>
		<title>Questions-r</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Questions-r&amp;diff=50"/>
		<updated>2022-01-10T16:32:21Z</updated>

		<summary type="html">&lt;p&gt;88.126.37.20 : pour continuer l&amp;#039;édition&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cette page reprend la &amp;quot;substantifique moelle&amp;quot; des échanges ayant eu lieu sur le channel &#039;&#039;&#039;questions-r&#039;&#039;&#039; du Discord d&#039;ISIG.&lt;br /&gt;
&lt;br /&gt;
== Manipulation d&#039;un nom de fichier ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question posée par martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Comment récupérer un morceau du nom du fichier ? Par exemple à partir de &#039;&#039;&#039;&amp;quot;zarsqdfqsfd33vezre20618402.csv&#039;&#039;&#039; on veut récupérer &#039;&#039;&#039;20618402&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor et sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Combi des &#039;&#039;&#039;expressions régulières&#039;&#039;&#039; et de la fonction &#039;&#039;&#039;basename()&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;za/rsqd/fqsfd33vezre20618402.csv&amp;quot; %&amp;gt;%&lt;br /&gt;
  basename() %&amp;gt;% # donne &amp;quot;fqsfd33vezre20618402.csv&amp;quot;&lt;br /&gt;
  stringr::str_replace(&amp;quot;.csv&amp;quot;,&amp;quot;&amp;quot;) %&amp;gt;% # donne &amp;quot;fqsfd33vezre20618402&amp;quot;&lt;br /&gt;
  stringr::str_extract(pattern=&amp;quot;.{8}(?=\\.$)&amp;quot;) # donne &amp;quot;20618402&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reformattage d&#039;un fichier en &amp;quot;longueur&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de mcottet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;ai une bdd avec plusieurs variables catégorielles qui portent une info similaire (est ce que les gens ont vu l&#039;espèce A un peu, bcp, passionnément, à la folie ; idem pour l&#039;espèce B, C...). Et j&#039;aimerais faire une somme pour savoir combien de fois l&#039;individu 1 a répondu un peu à l&#039;ensemble des espèces proposées, bcp à l&#039;ensemble des espèces...&lt;br /&gt;
il y a 18 espèces (donc 18 variables)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tidyr::pivot_longer()&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dans ta version de BDD, tu as 18 variables différentes&lt;br /&gt;
Mais en fait, tu pourrais considérer que ces 18 colonnes correspondent en fait à 2 colonnes (une colonne &amp;quot;espece&amp;quot; et une colonne &amp;quot;valeur&amp;quot;)&lt;br /&gt;
Tu cherches de ce fait à répéter l&#039;ensemble des autres colonnes (toutes celles qui ne font pas partie des 18 sus-mentionnées) 18 fois, mais &amp;quot;en hauteur&amp;quot;.&lt;br /&gt;
Du coup, ton tableau qui est &amp;quot;plutôt large&amp;quot; devient un tableau &amp;quot;plutôt long&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;appel à la fonction, tu précises quelles sont les variables que tu récupères pour les mettre &amp;quot;en long&amp;quot;&lt;br /&gt;
et toutes les autres, il les répète à l&#039;identique autant de fois que nécessaire&lt;br /&gt;
&lt;br /&gt;
A une époque, ça s&#039;appelait pas pivot_wider() et pivot_longer() mais spread() et gather()&lt;br /&gt;
(mais c&#039;était moins explicite comme nom)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;arrive à aller chercher différents fichiers excel et à les &amp;quot;rbind&amp;quot; avec ça :&lt;br /&gt;
temp_data &amp;lt;- list.files(path_to_files, pattern = &#039;*.xlsx&#039;) %&amp;gt;% &lt;br /&gt;
  purrr::map_dfr(~readxl::read_xlsx(paste0(path_to_files, .x)))&lt;br /&gt;
&lt;br /&gt;
Maintenant, chaque fichier contient un champ &amp;quot;date&amp;quot;... Comment pourrais-je faire pour qu&#039;au lieu de les ajouter à la suite les uns des autres, je les joignent par date ?&lt;br /&gt;
&lt;br /&gt;
J&#039;ai 15 fichiers excels, que, jusqu&#039;ici, je lis à la suite et colle les uns après les autres. Ce qu&#039;il me faudrait, à présent, c&#039;est une sorte de &#039;recast&#039; en fait, mais avec comme identifiant commun une variable lubridate. Pour qu&#039;au lieux d&#039;avoir une colonne qui m&#039;indique le nom du site (= le nom du fichier en entrée) et une autre une valeur de température, je me retrouve avec un tableau &#039;large&#039; avec comme nom de colonne chacune des stations contenant sa valeur de température.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de defuneste et sduneme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
do.call et/ou pivot_wider [[https://tidyr.tidyverse.org/articles/pivot.html#wider]]&lt;br /&gt;
&lt;br /&gt;
C&#039;est qu&#039;est ce que j&#039;avais essayé au départ, mais ça n&#039;marchait pas...&lt;br /&gt;
Parce que j&#039;avais une variable &#039;id&#039; qui empêchait le regroupement de se faire correctement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
df %&amp;gt;% &lt;br /&gt;
  select(timestamp, station, temperature) %&amp;gt;%&lt;br /&gt;
  pivot_wider(names_from=station, values_from=temperature)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution non-purrr&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Chargement des library / installation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
# install.packages(&amp;quot;tidyverse&amp;quot;)&lt;br /&gt;
# install.packages(&amp;quot;readxl&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# les données sont dans un répertoire enfant:&lt;br /&gt;
&lt;br /&gt;
file_path &amp;lt;- list.files(path = &amp;quot;data&amp;quot;,&lt;br /&gt;
                        pattern = &amp;quot;*.xlsx&amp;quot;,&lt;br /&gt;
                        full.names =  TRUE) # pas mal pour t&#039;economiser un paste0&lt;br /&gt;
&lt;br /&gt;
# une fonction qui lis un xlss&lt;br /&gt;
lis_un_fichier_excel &amp;lt;- function(un_chemin_de_fichier) { &lt;br /&gt;
                                  readxl::read_xlsx(un_chemin_de_fichier)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# on teste&lt;br /&gt;
lis_un_fichier_excel(file_path[1])&lt;br /&gt;
&lt;br /&gt;
# une liste de df&lt;br /&gt;
une_liste_de_tableau &amp;lt;- lapply(file_path, &amp;quot;lis_un_fichier_excel&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# on ajoute les lignes&lt;br /&gt;
mon_tableau_en_tidy &amp;lt;- do.call(&amp;quot;rbind&amp;quot;, une_liste_de_tableau)&lt;br /&gt;
mon_tableau_en_tidy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complétion des données d&#039;une série temporelle ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de Théo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
j&#039;ai une série temporelle de hauteurs d&#039;eau à pas de temps 15 min, mais il y a plein de trous dedans et je voudrais la compléter, en ajoutant l&#039;heure manquante, et la hauteur d&#039;eau manquante (moyenne de t-15 et t+15 si t est la valeur manquante). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
il faut que tu commences par te créer un index de temps à l&#039;intervalle voulu, depuis ta première valeur jusqu&#039;à la dernière, à laquelle tu joins ton jeu de données réel. Les trous vont alors apparaître en &#039;NA&#039;. Et si tu n&#039;as que quelques trous de jamais plus de 2 intervalles, tu peux utiliser la fonction zoo::na_approx() qui fera l&#039;affaire...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(dplyr)&lt;br /&gt;
H_15_raw = readr::read_delim(&amp;quot;H_15MIN_SB_CSV.csv&amp;quot;, delim = &amp;quot;;&amp;quot;) %&amp;gt;% &lt;br /&gt;
  mutate(Date = lubridate::dmy_hm(Date))&lt;br /&gt;
&lt;br /&gt;
timestamp = seq(from = min(H_15_raw$Date), to = max(H_15_raw$Date), by = &amp;quot;15 min&amp;quot;) %&amp;gt;% &lt;br /&gt;
  as_tibble() %&amp;gt;% &lt;br /&gt;
  select(Date = value)&lt;br /&gt;
&lt;br /&gt;
H_15_corr =&lt;br /&gt;
  left_join(timestamp, H_15_raw, by =&amp;quot;Date&amp;quot;) %&amp;gt;% &lt;br /&gt;
  mutate(H_CM_SB_BH = zoo::na.approx(H_CM_SB_BH))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regarde ?na.approx pour plus de détails sur son fonctionnement&lt;br /&gt;
&lt;br /&gt;
== Programmation fonctionnelle ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;ai un jeu de données avec des températures à pas de temps horaire, le tout sur plusieurs années (et plusieurs stations). J&#039;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&#039;aurais créé un nouveau champ pour lequel j&#039;incrémente une valeur de séquence à chaque fois que T&amp;gt;19 et que T-1&amp;lt;19. Je regarde la valeur max de ma séquence, et la longueur max de ces séquences également. Mais comment faire sans boucle ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
get_sequences=function(donnees, Temp){&lt;br /&gt;
  result = donnees %&amp;gt;% &lt;br /&gt;
    mutate(change = case_when(chmes_valeur &amp;gt; Temp &amp;amp; lag(chmes_valeur &amp;lt;= Temp) ~ 1,&lt;br /&gt;
                              TRUE ~ 0)) %&amp;gt;% &lt;br /&gt;
    mutate(sequence = case_when(chmes_valeur &amp;gt; Temp ~ cumsum(as.numeric(change)),&lt;br /&gt;
                                TRUE ~ NA_real_))&lt;br /&gt;
  return(result)&lt;br /&gt;
}&lt;br /&gt;
result= dat %&amp;gt;% &lt;br /&gt;
  group_by(chmes_coderhj,chmes_anneebiol) %&amp;gt;% &lt;br /&gt;
  tidyr::nest() %&amp;gt;% &lt;br /&gt;
  mutate(data=purrr::map(data,get_sequences,Temp=19)) %&amp;gt;% &lt;br /&gt;
  tidyr::unnest(cols=c(data))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou bien (autre syntaxe possible pour map), comme ça:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
result= dat %&amp;gt;% &lt;br /&gt;
  group_by(chmes_coderhj,chmes_anneebiol) %&amp;gt;% &lt;br /&gt;
  tidyr::nest() %&amp;gt;% &lt;br /&gt;
  mutate(data=purrr::map(data,~get_sequences(.,Temp=19))) %&amp;gt;% &lt;br /&gt;
  tidyr::unnest(cols=c(data))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Différence entre avec et sans &#039;~&#039; devant la fonction:&lt;br /&gt;
&lt;br /&gt;
* soit map attend le nom d&#039;une fonction&lt;br /&gt;
: Dans ce cas l&#039;argument sur lequel il itère doit être le premier argument de la fonction&lt;br /&gt;
* soit map attend une formule (précédée d&#039;un &amp;quot;~&amp;quot;, donc)&lt;br /&gt;
: Dans ce cas il y a un peu plus de souplesse sur la position de l&#039;argument sur lequel on itère&lt;br /&gt;
&lt;br /&gt;
Tu pourrais dire ~ get_sequences(data, Temp=.) pour itérer sur une variable qui donnerait un seuil de température, par exemple&lt;br /&gt;
et non plus itérer sur le premier argument, &amp;quot;data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Si tu donnes le nom de la fonction, tu peux quand-même rajouter des arguments &amp;quot;secondaires&amp;quot;&lt;br /&gt;
mais tu les rajoutes directement comme arguments optionnels à la fonction &amp;quot;map&amp;quot;, pas dans un simulacre d&#039;appel à la fonction que tu itères&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation des formules c&#039;est un subtilité introduite pour gérer les fonctions qui n&#039;ont pas les arguments &amp;quot;dans l&#039;ordre le plus pratique au regard de ce qu&#039;on souhaite faire&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question complémentaire&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
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&#039;inclure dans la fct &#039;get_sequences&#039;, ou de repartir des résultats de cette fonction et d&#039;alimenter une nouvelle ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Réponse &#039;&#039;&#039;&lt;br /&gt;
Le nombre de total de séquences et la durée de la séquence la plus longue, ce sont des &amp;quot;agrégations&amp;quot; de ce que tu as fait avant. Or, il est possible que tu veuilles utiliser les résultats de get_sequences tels quels (par exemple pour des graphiques). Donc il vaut mieux faire en sorte que cette agrégation ait lieu dans un second temps =&amp;gt; définition d&#039;une nouvelle fonction par exemple. &lt;br /&gt;
&lt;br /&gt;
En revanche, je pense que tu pourrais faire tourner ce calcul avant de &amp;quot;unnest&amp;quot; car tes séquences n&#039;ont pas des identifiants uniques en l&#039;état (les identifiants ne sont uniques que au sein des sous-jeux de données imbriqués)&lt;br /&gt;
&lt;br /&gt;
avec n_distinct, je chope le nb total de séquences&lt;br /&gt;
Pour choper la durée de la séquence la plus longue, tu suggérerais quoi ?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
... %&amp;gt;% &lt;br /&gt;
  group_by(sequence) %&amp;gt;%&lt;br /&gt;
  summarise(duration=max(time)-min(time)) %&amp;gt;%&lt;br /&gt;
  ungroup() %&amp;gt;%&lt;br /&gt;
  mutate(n_sequences=n()) %&amp;gt;%&lt;br /&gt;
  top_n(1,duration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le mutate (n_sequences=n()) te rajoute le nombre de séquences sans résumer (ça répète autant de fois que nécessaire la valeur n_sequences)&lt;br /&gt;
du coup après quand tu gardes que la top duration t&#039;as quand-même l&#039;info qu&#039;il te faut.&lt;br /&gt;
&lt;br /&gt;
== Annonces de nouveau packages R ==&lt;br /&gt;
&lt;br /&gt;
=== banqueHydro === &lt;br /&gt;
&lt;br /&gt;
[[https://github.com/lvaudor/banqueHydro]]&lt;br /&gt;
&lt;br /&gt;
Pour &amp;quot;scraper&amp;quot; les données du site banqueHydro (en attendant l&#039;API Hubeau [[https://github.com/BRGM/hubeau/projects]]).&lt;br /&gt;
&lt;br /&gt;
== Annonces de formations/tutos/conf ==&lt;br /&gt;
 * [[https://sigr2021.github.io/site/index.html|supports SIGR]] recommandé par defuneste&lt;br /&gt;
 * [[https://blog.sellorm.com/2017/12/18/learn-to-write-command-line-utilities-in-r/|billet command line utilities in R]] recommandé par defuneste&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Continuer l&#039;édition ==&lt;br /&gt;
&lt;br /&gt;
sur Discord, channel questions-r:&lt;br /&gt;
&lt;br /&gt;
!saveconv 882172361246396427 883000807585374258&lt;/div&gt;</summary>
		<author><name>88.126.37.20</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Questions-r&amp;diff=49</id>
		<title>Questions-r</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Questions-r&amp;diff=49"/>
		<updated>2022-01-10T16:27:05Z</updated>

		<summary type="html">&lt;p&gt;88.126.37.20 : /* Reformattage d&amp;#039;un fichier en &amp;quot;longueur&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cette page reprend la &amp;quot;substantifique moelle&amp;quot; des échanges ayant eu lieu sur le channel &#039;&#039;&#039;questions-r&#039;&#039;&#039; du Discord d&#039;ISIG.&lt;br /&gt;
&lt;br /&gt;
== Manipulation d&#039;un nom de fichier ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question posée par martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Comment récupérer un morceau du nom du fichier ? Par exemple à partir de &#039;&#039;&#039;&amp;quot;zarsqdfqsfd33vezre20618402.csv&#039;&#039;&#039; on veut récupérer &#039;&#039;&#039;20618402&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor et sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Combi des &#039;&#039;&#039;expressions régulières&#039;&#039;&#039; et de la fonction &#039;&#039;&#039;basename()&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;za/rsqd/fqsfd33vezre20618402.csv&amp;quot; %&amp;gt;%&lt;br /&gt;
  basename() %&amp;gt;% # donne &amp;quot;fqsfd33vezre20618402.csv&amp;quot;&lt;br /&gt;
  stringr::str_replace(&amp;quot;.csv&amp;quot;,&amp;quot;&amp;quot;) %&amp;gt;% # donne &amp;quot;fqsfd33vezre20618402&amp;quot;&lt;br /&gt;
  stringr::str_extract(pattern=&amp;quot;.{8}(?=\\.$)&amp;quot;) # donne &amp;quot;20618402&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reformattage d&#039;un fichier en &amp;quot;longueur&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de mcottet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;ai une bdd avec plusieurs variables catégorielles qui portent une info similaire (est ce que les gens ont vu l&#039;espèce A un peu, bcp, passionnément, à la folie ; idem pour l&#039;espèce B, C...). Et j&#039;aimerais faire une somme pour savoir combien de fois l&#039;individu 1 a répondu un peu à l&#039;ensemble des espèces proposées, bcp à l&#039;ensemble des espèces...&lt;br /&gt;
il y a 18 espèces (donc 18 variables)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tidyr::pivot_longer()&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dans ta version de BDD, tu as 18 variables différentes&lt;br /&gt;
Mais en fait, tu pourrais considérer que ces 18 colonnes correspondent en fait à 2 colonnes (une colonne &amp;quot;espece&amp;quot; et une colonne &amp;quot;valeur&amp;quot;)&lt;br /&gt;
Tu cherches de ce fait à répéter l&#039;ensemble des autres colonnes (toutes celles qui ne font pas partie des 18 sus-mentionnées) 18 fois, mais &amp;quot;en hauteur&amp;quot;.&lt;br /&gt;
Du coup, ton tableau qui est &amp;quot;plutôt large&amp;quot; devient un tableau &amp;quot;plutôt long&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;appel à la fonction, tu précises quelles sont les variables que tu récupères pour les mettre &amp;quot;en long&amp;quot;&lt;br /&gt;
et toutes les autres, il les répète à l&#039;identique autant de fois que nécessaire&lt;br /&gt;
&lt;br /&gt;
A une époque, ça s&#039;appelait pas pivot_wider() et pivot_longer() mais spread() et gather()&lt;br /&gt;
(mais c&#039;était moins explicite comme nom)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;arrive à aller chercher différents fichiers excel et à les &amp;quot;rbind&amp;quot; avec ça :&lt;br /&gt;
temp_data &amp;lt;- list.files(path_to_files, pattern = &#039;*.xlsx&#039;) %&amp;gt;% &lt;br /&gt;
  purrr::map_dfr(~readxl::read_xlsx(paste0(path_to_files, .x)))&lt;br /&gt;
&lt;br /&gt;
Maintenant, chaque fichier contient un champ &amp;quot;date&amp;quot;... Comment pourrais-je faire pour qu&#039;au lieu de les ajouter à la suite les uns des autres, je les joignent par date ?&lt;br /&gt;
&lt;br /&gt;
J&#039;ai 15 fichiers excels, que, jusqu&#039;ici, je lis à la suite et colle les uns après les autres. Ce qu&#039;il me faudrait, à présent, c&#039;est une sorte de &#039;recast&#039; en fait, mais avec comme identifiant commun une variable lubridate. Pour qu&#039;au lieux d&#039;avoir une colonne qui m&#039;indique le nom du site (= le nom du fichier en entrée) et une autre une valeur de température, je me retrouve avec un tableau &#039;large&#039; avec comme nom de colonne chacune des stations contenant sa valeur de température.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de defuneste et sduneme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
do.call et/ou pivot_wider [[https://tidyr.tidyverse.org/articles/pivot.html#wider]]&lt;br /&gt;
&lt;br /&gt;
C&#039;est qu&#039;est ce que j&#039;avais essayé au départ, mais ça n&#039;marchait pas...&lt;br /&gt;
Parce que j&#039;avais une variable &#039;id&#039; qui empêchait le regroupement de se faire correctement&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
df %&amp;gt;% &lt;br /&gt;
  select(timestamp, station, temperature) %&amp;gt;%&lt;br /&gt;
  pivot_wider(names_from=station, values_from=temperature)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solution non-purrr&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Chargement des library / installation&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
# install.packages(&amp;quot;tidyverse&amp;quot;)&lt;br /&gt;
# install.packages(&amp;quot;readxl&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# les données sont dans un répertoire enfant:&lt;br /&gt;
&lt;br /&gt;
file_path &amp;lt;- list.files(path = &amp;quot;data&amp;quot;,&lt;br /&gt;
                        pattern = &amp;quot;*.xlsx&amp;quot;,&lt;br /&gt;
                        full.names =  TRUE) # pas mal pour t&#039;economiser un paste0&lt;br /&gt;
&lt;br /&gt;
# une fonction qui lis un xlss&lt;br /&gt;
lis_un_fichier_excel &amp;lt;- function(un_chemin_de_fichier) { &lt;br /&gt;
                                  readxl::read_xlsx(un_chemin_de_fichier)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# on teste&lt;br /&gt;
lis_un_fichier_excel(file_path[1])&lt;br /&gt;
&lt;br /&gt;
# une liste de df&lt;br /&gt;
une_liste_de_tableau &amp;lt;- lapply(file_path, &amp;quot;lis_un_fichier_excel&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# on ajoute les lignes&lt;br /&gt;
mon_tableau_en_tidy &amp;lt;- do.call(&amp;quot;rbind&amp;quot;, une_liste_de_tableau)&lt;br /&gt;
mon_tableau_en_tidy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Complétion des données d&#039;une série temporelle ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de Théo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
j&#039;ai une série temporelle de hauteurs d&#039;eau à pas de temps 15 min, mais il y a plein de trous dedans et je voudrais la compléter, en ajoutant l&#039;heure manquante, et la hauteur d&#039;eau manquante (moyenne de t-15 et t+15 si t est la valeur manquante). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
il faut que tu commences par te créer un index de temps à l&#039;intervalle voulu, depuis ta première valeur jusqu&#039;à la dernière, à laquelle tu joins ton jeu de données réel. Les trous vont alors apparaître en &#039;NA&#039;. Et si tu n&#039;as que quelques trous de jamais plus de 2 intervalles, tu peux utiliser la fonction zoo::na_approx() qui fera l&#039;affaire...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(dplyr)&lt;br /&gt;
H_15_raw = readr::read_delim(&amp;quot;H_15MIN_SB_CSV.csv&amp;quot;, delim = &amp;quot;;&amp;quot;) %&amp;gt;% &lt;br /&gt;
  mutate(Date = lubridate::dmy_hm(Date))&lt;br /&gt;
&lt;br /&gt;
timestamp = seq(from = min(H_15_raw$Date), to = max(H_15_raw$Date), by = &amp;quot;15 min&amp;quot;) %&amp;gt;% &lt;br /&gt;
  as_tibble() %&amp;gt;% &lt;br /&gt;
  select(Date = value)&lt;br /&gt;
&lt;br /&gt;
H_15_corr =&lt;br /&gt;
  left_join(timestamp, H_15_raw, by =&amp;quot;Date&amp;quot;) %&amp;gt;% &lt;br /&gt;
  mutate(H_CM_SB_BH = zoo::na.approx(H_CM_SB_BH))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regarde ?na.approx pour plus de détails sur son fonctionnement&lt;br /&gt;
&lt;br /&gt;
== Programmation fonctionnelle ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;ai un jeu de données avec des températures à pas de temps horaire, le tout sur plusieurs années (et plusieurs stations). J&#039;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&#039;aurais créé un nouveau champ pour lequel j&#039;incrémente une valeur de séquence à chaque fois que T&amp;gt;19 et que T-1&amp;lt;19. Je regarde la valeur max de ma séquence, et la longueur max de ces séquences également. Mais comment faire sans boucle ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
get_sequences=function(donnees, Temp){&lt;br /&gt;
  result = donnees %&amp;gt;% &lt;br /&gt;
    mutate(change = case_when(chmes_valeur &amp;gt; Temp &amp;amp; lag(chmes_valeur &amp;lt;= Temp) ~ 1,&lt;br /&gt;
                              TRUE ~ 0)) %&amp;gt;% &lt;br /&gt;
    mutate(sequence = case_when(chmes_valeur &amp;gt; Temp ~ cumsum(as.numeric(change)),&lt;br /&gt;
                                TRUE ~ NA_real_))&lt;br /&gt;
  return(result)&lt;br /&gt;
}&lt;br /&gt;
result= dat %&amp;gt;% &lt;br /&gt;
  group_by(chmes_coderhj,chmes_anneebiol) %&amp;gt;% &lt;br /&gt;
  tidyr::nest() %&amp;gt;% &lt;br /&gt;
  mutate(data=purrr::map(data,get_sequences,Temp=19)) %&amp;gt;% &lt;br /&gt;
  tidyr::unnest(cols=c(data))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou bien (autre syntaxe possible pour map), comme ça:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
result= dat %&amp;gt;% &lt;br /&gt;
  group_by(chmes_coderhj,chmes_anneebiol) %&amp;gt;% &lt;br /&gt;
  tidyr::nest() %&amp;gt;% &lt;br /&gt;
  mutate(data=purrr::map(data,~get_sequences(.,Temp=19))) %&amp;gt;% &lt;br /&gt;
  tidyr::unnest(cols=c(data))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Différence entre avec et sans &#039;~&#039; devant la fonction:&lt;br /&gt;
&lt;br /&gt;
* soit map attend le nom d&#039;une fonction&lt;br /&gt;
: Dans ce cas l&#039;argument sur lequel il itère doit être le premier argument de la fonction&lt;br /&gt;
* soit map attend une formule (précédée d&#039;un &amp;quot;~&amp;quot;, donc)&lt;br /&gt;
: Dans ce cas il y a un peu plus de souplesse sur la position de l&#039;argument sur lequel on itère&lt;br /&gt;
&lt;br /&gt;
Tu pourrais dire ~ get_sequences(data, Temp=.) pour itérer sur une variable qui donnerait un seuil de température, par exemple&lt;br /&gt;
et non plus itérer sur le premier argument, &amp;quot;data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Si tu donnes le nom de la fonction, tu peux quand-même rajouter des arguments &amp;quot;secondaires&amp;quot;&lt;br /&gt;
mais tu les rajoutes directement comme arguments optionnels à la fonction &amp;quot;map&amp;quot;, pas dans un simulacre d&#039;appel à la fonction que tu itères&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation des formules c&#039;est un subtilité introduite pour gérer les fonctions qui n&#039;ont pas les arguments &amp;quot;dans l&#039;ordre le plus pratique au regard de ce qu&#039;on souhaite faire&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question complémentaire&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
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&#039;inclure dans la fct &#039;get_sequences&#039;, ou de repartir des résultats de cette fonction et d&#039;alimenter une nouvelle ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Réponse &#039;&#039;&#039;&lt;br /&gt;
Le nombre de total de séquences et la durée de la séquence la plus longue, ce sont des &amp;quot;agrégations&amp;quot; de ce que tu as fait avant. Or, il est possible que tu veuilles utiliser les résultats de get_sequences tels quels (par exemple pour des graphiques). Donc il vaut mieux faire en sorte que cette agrégation ait lieu dans un second temps =&amp;gt; définition d&#039;une nouvelle fonction par exemple. &lt;br /&gt;
&lt;br /&gt;
En revanche, je pense que tu pourrais faire tourner ce calcul avant de &amp;quot;unnest&amp;quot; car tes séquences n&#039;ont pas des identifiants uniques en l&#039;état (les identifiants ne sont uniques que au sein des sous-jeux de données imbriqués)&lt;br /&gt;
&lt;br /&gt;
avec n_distinct, je chope le nb total de séquences&lt;br /&gt;
Pour choper la durée de la séquence la plus longue, tu suggérerais quoi ?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
... %&amp;gt;% &lt;br /&gt;
  group_by(sequence) %&amp;gt;%&lt;br /&gt;
  summarise(duration=max(time)-min(time)) %&amp;gt;%&lt;br /&gt;
  ungroup() %&amp;gt;%&lt;br /&gt;
  mutate(n_sequences=n()) %&amp;gt;%&lt;br /&gt;
  top_n(1,duration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le mutate (n_sequences=n()) te rajoute le nombre de séquences sans résumer (ça répète autant de fois que nécessaire la valeur n_sequences)&lt;br /&gt;
du coup après quand tu gardes que la top duration t&#039;as quand-même l&#039;info qu&#039;il te faut&lt;br /&gt;
== Annonces de nouveau packages R ==&lt;br /&gt;
&lt;br /&gt;
=== banqueHydro === &lt;br /&gt;
&lt;br /&gt;
[[https://github.com/lvaudor/banqueHydro]]&lt;br /&gt;
&lt;br /&gt;
Pour &amp;quot;scraper&amp;quot; les données du site banqueHydro (en attendant l&#039;API Hubeau [[https://github.com/BRGM/hubeau/projects]]).&lt;br /&gt;
&lt;br /&gt;
== Annonces de formations/tutos/conf ==&lt;br /&gt;
 * [[https://sigr2021.github.io/site/index.html|supports SIGR]] recommandé par defuneste&lt;br /&gt;
 * [[https://blog.sellorm.com/2017/12/18/learn-to-write-command-line-utilities-in-r/|billet command line utilities in R]] recommandé par defuneste&lt;/div&gt;</summary>
		<author><name>88.126.37.20</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Questions-r&amp;diff=48</id>
		<title>Questions-r</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Questions-r&amp;diff=48"/>
		<updated>2022-01-10T16:15:07Z</updated>

		<summary type="html">&lt;p&gt;88.126.37.20 : /* Annonces de formations/tutos/conf */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cette page reprend la &amp;quot;substantifique moelle&amp;quot; des échanges ayant eu lieu sur le channel &#039;&#039;&#039;questions-r&#039;&#039;&#039; du Discord d&#039;ISIG.&lt;br /&gt;
&lt;br /&gt;
== Manipulation d&#039;un nom de fichier ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question posée par martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Comment récupérer un morceau du nom du fichier ? Par exemple à partir de &#039;&#039;&#039;&amp;quot;zarsqdfqsfd33vezre20618402.csv&#039;&#039;&#039; on veut récupérer &#039;&#039;&#039;20618402&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor et sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Combi des &#039;&#039;&#039;expressions régulières&#039;&#039;&#039; et de la fonction &#039;&#039;&#039;basename()&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;za/rsqd/fqsfd33vezre20618402.csv&amp;quot; %&amp;gt;%&lt;br /&gt;
  basename() %&amp;gt;% # donne &amp;quot;fqsfd33vezre20618402.csv&amp;quot;&lt;br /&gt;
  stringr::str_replace(&amp;quot;.csv&amp;quot;,&amp;quot;&amp;quot;) %&amp;gt;% # donne &amp;quot;fqsfd33vezre20618402&amp;quot;&lt;br /&gt;
  stringr::str_extract(pattern=&amp;quot;.{8}(?=\\.$)&amp;quot;) # donne &amp;quot;20618402&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reformattage d&#039;un fichier en &amp;quot;longueur&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de mcottet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;ai une bdd avec plusieurs variables catégorielles qui portent une info similaire (est ce que les gens ont vu l&#039;espèce A un peu, bcp, passionnément, à la folie ; idem pour l&#039;espèce B, C...). Et j&#039;aimerais faire une somme pour savoir combien de fois l&#039;individu 1 a répondu un peu à l&#039;ensemble des espèces proposées, bcp à l&#039;ensemble des espèces...&lt;br /&gt;
il y a 18 espèces (donc 18 variables)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tidyr::pivot_longer()&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dans ta version de BDD, tu as 18 variables différentes&lt;br /&gt;
Mais en fait, tu pourrais considérer que ces 18 colonnes correspondent en fait à 2 colonnes (une colonne &amp;quot;espece&amp;quot; et une colonne &amp;quot;valeur&amp;quot;)&lt;br /&gt;
Tu cherches de ce fait à répéter l&#039;ensemble des autres colonnes (toutes celles qui ne font pas partie des 18 sus-mentionnées) 18 fois, mais &amp;quot;en hauteur&amp;quot;.&lt;br /&gt;
Du coup, ton tableau qui est &amp;quot;plutôt large&amp;quot; devient un tableau &amp;quot;plutôt long&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;appel à la fonction, tu précises quelles sont les variables que tu récupères pour les mettre &amp;quot;en long&amp;quot;&lt;br /&gt;
et toutes les autres, il les répète à l&#039;identique autant de fois que nécessaire&lt;br /&gt;
&lt;br /&gt;
A une époque, ça s&#039;appelait pas pivot_wider() et pivot_longer() mais spread() et gather()&lt;br /&gt;
(mais c&#039;était moins explicite comme nom)&lt;br /&gt;
&lt;br /&gt;
== Complétion des données d&#039;une série temporelle ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de Théo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
j&#039;ai une série temporelle de hauteurs d&#039;eau à pas de temps 15 min, mais il y a plein de trous dedans et je voudrais la compléter, en ajoutant l&#039;heure manquante, et la hauteur d&#039;eau manquante (moyenne de t-15 et t+15 si t est la valeur manquante). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
il faut que tu commences par te créer un index de temps à l&#039;intervalle voulu, depuis ta première valeur jusqu&#039;à la dernière, à laquelle tu joins ton jeu de données réel. Les trous vont alors apparaître en &#039;NA&#039;. Et si tu n&#039;as que quelques trous de jamais plus de 2 intervalles, tu peux utiliser la fonction zoo::na_approx() qui fera l&#039;affaire...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(dplyr)&lt;br /&gt;
H_15_raw = readr::read_delim(&amp;quot;H_15MIN_SB_CSV.csv&amp;quot;, delim = &amp;quot;;&amp;quot;) %&amp;gt;% &lt;br /&gt;
  mutate(Date = lubridate::dmy_hm(Date))&lt;br /&gt;
&lt;br /&gt;
timestamp = seq(from = min(H_15_raw$Date), to = max(H_15_raw$Date), by = &amp;quot;15 min&amp;quot;) %&amp;gt;% &lt;br /&gt;
  as_tibble() %&amp;gt;% &lt;br /&gt;
  select(Date = value)&lt;br /&gt;
&lt;br /&gt;
H_15_corr =&lt;br /&gt;
  left_join(timestamp, H_15_raw, by =&amp;quot;Date&amp;quot;) %&amp;gt;% &lt;br /&gt;
  mutate(H_CM_SB_BH = zoo::na.approx(H_CM_SB_BH))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regarde ?na.approx pour plus de détails sur son fonctionnement&lt;br /&gt;
&lt;br /&gt;
== Programmation fonctionnelle ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;ai un jeu de données avec des températures à pas de temps horaire, le tout sur plusieurs années (et plusieurs stations). J&#039;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&#039;aurais créé un nouveau champ pour lequel j&#039;incrémente une valeur de séquence à chaque fois que T&amp;gt;19 et que T-1&amp;lt;19. Je regarde la valeur max de ma séquence, et la longueur max de ces séquences également. Mais comment faire sans boucle ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
get_sequences=function(donnees, Temp){&lt;br /&gt;
  result = donnees %&amp;gt;% &lt;br /&gt;
    mutate(change = case_when(chmes_valeur &amp;gt; Temp &amp;amp; lag(chmes_valeur &amp;lt;= Temp) ~ 1,&lt;br /&gt;
                              TRUE ~ 0)) %&amp;gt;% &lt;br /&gt;
    mutate(sequence = case_when(chmes_valeur &amp;gt; Temp ~ cumsum(as.numeric(change)),&lt;br /&gt;
                                TRUE ~ NA_real_))&lt;br /&gt;
  return(result)&lt;br /&gt;
}&lt;br /&gt;
result= dat %&amp;gt;% &lt;br /&gt;
  group_by(chmes_coderhj,chmes_anneebiol) %&amp;gt;% &lt;br /&gt;
  tidyr::nest() %&amp;gt;% &lt;br /&gt;
  mutate(data=purrr::map(data,get_sequences,Temp=19)) %&amp;gt;% &lt;br /&gt;
  tidyr::unnest(cols=c(data))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou bien (autre syntaxe possible pour map), comme ça:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
result= dat %&amp;gt;% &lt;br /&gt;
  group_by(chmes_coderhj,chmes_anneebiol) %&amp;gt;% &lt;br /&gt;
  tidyr::nest() %&amp;gt;% &lt;br /&gt;
  mutate(data=purrr::map(data,~get_sequences(.,Temp=19))) %&amp;gt;% &lt;br /&gt;
  tidyr::unnest(cols=c(data))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Différence entre avec et sans &#039;~&#039; devant la fonction:&lt;br /&gt;
&lt;br /&gt;
* soit map attend le nom d&#039;une fonction&lt;br /&gt;
: Dans ce cas l&#039;argument sur lequel il itère doit être le premier argument de la fonction&lt;br /&gt;
* soit map attend une formule (précédée d&#039;un &amp;quot;~&amp;quot;, donc)&lt;br /&gt;
: Dans ce cas il y a un peu plus de souplesse sur la position de l&#039;argument sur lequel on itère&lt;br /&gt;
&lt;br /&gt;
Tu pourrais dire ~ get_sequences(data, Temp=.) pour itérer sur une variable qui donnerait un seuil de température, par exemple&lt;br /&gt;
et non plus itérer sur le premier argument, &amp;quot;data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Si tu donnes le nom de la fonction, tu peux quand-même rajouter des arguments &amp;quot;secondaires&amp;quot;&lt;br /&gt;
mais tu les rajoutes directement comme arguments optionnels à la fonction &amp;quot;map&amp;quot;, pas dans un simulacre d&#039;appel à la fonction que tu itères&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation des formules c&#039;est un subtilité introduite pour gérer les fonctions qui n&#039;ont pas les arguments &amp;quot;dans l&#039;ordre le plus pratique au regard de ce qu&#039;on souhaite faire&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question complémentaire&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
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&#039;inclure dans la fct &#039;get_sequences&#039;, ou de repartir des résultats de cette fonction et d&#039;alimenter une nouvelle ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Réponse &#039;&#039;&#039;&lt;br /&gt;
Le nombre de total de séquences et la durée de la séquence la plus longue, ce sont des &amp;quot;agrégations&amp;quot; de ce que tu as fait avant. Or, il est possible que tu veuilles utiliser les résultats de get_sequences tels quels (par exemple pour des graphiques). Donc il vaut mieux faire en sorte que cette agrégation ait lieu dans un second temps =&amp;gt; définition d&#039;une nouvelle fonction par exemple. &lt;br /&gt;
&lt;br /&gt;
En revanche, je pense que tu pourrais faire tourner ce calcul avant de &amp;quot;unnest&amp;quot; car tes séquences n&#039;ont pas des identifiants uniques en l&#039;état (les identifiants ne sont uniques que au sein des sous-jeux de données imbriqués)&lt;br /&gt;
&lt;br /&gt;
avec n_distinct, je chope le nb total de séquences&lt;br /&gt;
Pour choper la durée de la séquence la plus longue, tu suggérerais quoi ?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
... %&amp;gt;% &lt;br /&gt;
  group_by(sequence) %&amp;gt;%&lt;br /&gt;
  summarise(duration=max(time)-min(time)) %&amp;gt;%&lt;br /&gt;
  ungroup() %&amp;gt;%&lt;br /&gt;
  mutate(n_sequences=n()) %&amp;gt;%&lt;br /&gt;
  top_n(1,duration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le mutate (n_sequences=n()) te rajoute le nombre de séquences sans résumer (ça répète autant de fois que nécessaire la valeur n_sequences)&lt;br /&gt;
du coup après quand tu gardes que la top duration t&#039;as quand-même l&#039;info qu&#039;il te faut&lt;br /&gt;
== Annonces de nouveau packages R ==&lt;br /&gt;
&lt;br /&gt;
=== banqueHydro === &lt;br /&gt;
&lt;br /&gt;
[[https://github.com/lvaudor/banqueHydro]]&lt;br /&gt;
&lt;br /&gt;
Pour &amp;quot;scraper&amp;quot; les données du site banqueHydro (en attendant l&#039;API Hubeau [[https://github.com/BRGM/hubeau/projects]]).&lt;br /&gt;
&lt;br /&gt;
== Annonces de formations/tutos/conf ==&lt;br /&gt;
 * [[https://sigr2021.github.io/site/index.html|supports SIGR]] recommandé par defuneste&lt;br /&gt;
 * [[https://blog.sellorm.com/2017/12/18/learn-to-write-command-line-utilities-in-r/|billet command line utilities in R]] recommandé par defuneste&lt;/div&gt;</summary>
		<author><name>88.126.37.20</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Questions-r&amp;diff=47</id>
		<title>Questions-r</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Questions-r&amp;diff=47"/>
		<updated>2022-01-10T16:07:08Z</updated>

		<summary type="html">&lt;p&gt;88.126.37.20 : arrange question martiste 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cette page reprend la &amp;quot;substantifique moelle&amp;quot; des échanges ayant eu lieu sur le channel &#039;&#039;&#039;questions-r&#039;&#039;&#039; du Discord d&#039;ISIG.&lt;br /&gt;
&lt;br /&gt;
== Manipulation d&#039;un nom de fichier ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question posée par martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Comment récupérer un morceau du nom du fichier ? Par exemple à partir de &#039;&#039;&#039;&amp;quot;zarsqdfqsfd33vezre20618402.csv&#039;&#039;&#039; on veut récupérer &#039;&#039;&#039;20618402&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor et sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Combi des &#039;&#039;&#039;expressions régulières&#039;&#039;&#039; et de la fonction &#039;&#039;&#039;basename()&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;za/rsqd/fqsfd33vezre20618402.csv&amp;quot; %&amp;gt;%&lt;br /&gt;
  basename() %&amp;gt;% # donne &amp;quot;fqsfd33vezre20618402.csv&amp;quot;&lt;br /&gt;
  stringr::str_replace(&amp;quot;.csv&amp;quot;,&amp;quot;&amp;quot;) %&amp;gt;% # donne &amp;quot;fqsfd33vezre20618402&amp;quot;&lt;br /&gt;
  stringr::str_extract(pattern=&amp;quot;.{8}(?=\\.$)&amp;quot;) # donne &amp;quot;20618402&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reformattage d&#039;un fichier en &amp;quot;longueur&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de mcottet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;ai une bdd avec plusieurs variables catégorielles qui portent une info similaire (est ce que les gens ont vu l&#039;espèce A un peu, bcp, passionnément, à la folie ; idem pour l&#039;espèce B, C...). Et j&#039;aimerais faire une somme pour savoir combien de fois l&#039;individu 1 a répondu un peu à l&#039;ensemble des espèces proposées, bcp à l&#039;ensemble des espèces...&lt;br /&gt;
il y a 18 espèces (donc 18 variables)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tidyr::pivot_longer()&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dans ta version de BDD, tu as 18 variables différentes&lt;br /&gt;
Mais en fait, tu pourrais considérer que ces 18 colonnes correspondent en fait à 2 colonnes (une colonne &amp;quot;espece&amp;quot; et une colonne &amp;quot;valeur&amp;quot;)&lt;br /&gt;
Tu cherches de ce fait à répéter l&#039;ensemble des autres colonnes (toutes celles qui ne font pas partie des 18 sus-mentionnées) 18 fois, mais &amp;quot;en hauteur&amp;quot;.&lt;br /&gt;
Du coup, ton tableau qui est &amp;quot;plutôt large&amp;quot; devient un tableau &amp;quot;plutôt long&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;appel à la fonction, tu précises quelles sont les variables que tu récupères pour les mettre &amp;quot;en long&amp;quot;&lt;br /&gt;
et toutes les autres, il les répète à l&#039;identique autant de fois que nécessaire&lt;br /&gt;
&lt;br /&gt;
A une époque, ça s&#039;appelait pas pivot_wider() et pivot_longer() mais spread() et gather()&lt;br /&gt;
(mais c&#039;était moins explicite comme nom)&lt;br /&gt;
&lt;br /&gt;
== Complétion des données d&#039;une série temporelle ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de Théo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
j&#039;ai une série temporelle de hauteurs d&#039;eau à pas de temps 15 min, mais il y a plein de trous dedans et je voudrais la compléter, en ajoutant l&#039;heure manquante, et la hauteur d&#039;eau manquante (moyenne de t-15 et t+15 si t est la valeur manquante). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
il faut que tu commences par te créer un index de temps à l&#039;intervalle voulu, depuis ta première valeur jusqu&#039;à la dernière, à laquelle tu joins ton jeu de données réel. Les trous vont alors apparaître en &#039;NA&#039;. Et si tu n&#039;as que quelques trous de jamais plus de 2 intervalles, tu peux utiliser la fonction zoo::na_approx() qui fera l&#039;affaire...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(dplyr)&lt;br /&gt;
H_15_raw = readr::read_delim(&amp;quot;H_15MIN_SB_CSV.csv&amp;quot;, delim = &amp;quot;;&amp;quot;) %&amp;gt;% &lt;br /&gt;
  mutate(Date = lubridate::dmy_hm(Date))&lt;br /&gt;
&lt;br /&gt;
timestamp = seq(from = min(H_15_raw$Date), to = max(H_15_raw$Date), by = &amp;quot;15 min&amp;quot;) %&amp;gt;% &lt;br /&gt;
  as_tibble() %&amp;gt;% &lt;br /&gt;
  select(Date = value)&lt;br /&gt;
&lt;br /&gt;
H_15_corr =&lt;br /&gt;
  left_join(timestamp, H_15_raw, by =&amp;quot;Date&amp;quot;) %&amp;gt;% &lt;br /&gt;
  mutate(H_CM_SB_BH = zoo::na.approx(H_CM_SB_BH))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regarde ?na.approx pour plus de détails sur son fonctionnement&lt;br /&gt;
&lt;br /&gt;
== Programmation fonctionnelle ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;ai un jeu de données avec des températures à pas de temps horaire, le tout sur plusieurs années (et plusieurs stations). J&#039;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&#039;aurais créé un nouveau champ pour lequel j&#039;incrémente une valeur de séquence à chaque fois que T&amp;gt;19 et que T-1&amp;lt;19. Je regarde la valeur max de ma séquence, et la longueur max de ces séquences également. Mais comment faire sans boucle ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
get_sequences=function(donnees, Temp){&lt;br /&gt;
  result = donnees %&amp;gt;% &lt;br /&gt;
    mutate(change = case_when(chmes_valeur &amp;gt; Temp &amp;amp; lag(chmes_valeur &amp;lt;= Temp) ~ 1,&lt;br /&gt;
                              TRUE ~ 0)) %&amp;gt;% &lt;br /&gt;
    mutate(sequence = case_when(chmes_valeur &amp;gt; Temp ~ cumsum(as.numeric(change)),&lt;br /&gt;
                                TRUE ~ NA_real_))&lt;br /&gt;
  return(result)&lt;br /&gt;
}&lt;br /&gt;
result= dat %&amp;gt;% &lt;br /&gt;
  group_by(chmes_coderhj,chmes_anneebiol) %&amp;gt;% &lt;br /&gt;
  tidyr::nest() %&amp;gt;% &lt;br /&gt;
  mutate(data=purrr::map(data,get_sequences,Temp=19)) %&amp;gt;% &lt;br /&gt;
  tidyr::unnest(cols=c(data))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou bien (autre syntaxe possible pour map), comme ça:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
result= dat %&amp;gt;% &lt;br /&gt;
  group_by(chmes_coderhj,chmes_anneebiol) %&amp;gt;% &lt;br /&gt;
  tidyr::nest() %&amp;gt;% &lt;br /&gt;
  mutate(data=purrr::map(data,~get_sequences(.,Temp=19))) %&amp;gt;% &lt;br /&gt;
  tidyr::unnest(cols=c(data))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Différence entre avec et sans &#039;~&#039; devant la fonction:&lt;br /&gt;
&lt;br /&gt;
* soit map attend le nom d&#039;une fonction&lt;br /&gt;
: Dans ce cas l&#039;argument sur lequel il itère doit être le premier argument de la fonction&lt;br /&gt;
* soit map attend une formule (précédée d&#039;un &amp;quot;~&amp;quot;, donc)&lt;br /&gt;
: Dans ce cas il y a un peu plus de souplesse sur la position de l&#039;argument sur lequel on itère&lt;br /&gt;
&lt;br /&gt;
Tu pourrais dire ~ get_sequences(data, Temp=.) pour itérer sur une variable qui donnerait un seuil de température, par exemple&lt;br /&gt;
et non plus itérer sur le premier argument, &amp;quot;data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Si tu donnes le nom de la fonction, tu peux quand-même rajouter des arguments &amp;quot;secondaires&amp;quot;&lt;br /&gt;
mais tu les rajoutes directement comme arguments optionnels à la fonction &amp;quot;map&amp;quot;, pas dans un simulacre d&#039;appel à la fonction que tu itères&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation des formules c&#039;est un subtilité introduite pour gérer les fonctions qui n&#039;ont pas les arguments &amp;quot;dans l&#039;ordre le plus pratique au regard de ce qu&#039;on souhaite faire&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question complémentaire&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
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&#039;inclure dans la fct &#039;get_sequences&#039;, ou de repartir des résultats de cette fonction et d&#039;alimenter une nouvelle ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Réponse &#039;&#039;&#039;&lt;br /&gt;
Le nombre de total de séquences et la durée de la séquence la plus longue, ce sont des &amp;quot;agrégations&amp;quot; de ce que tu as fait avant. Or, il est possible que tu veuilles utiliser les résultats de get_sequences tels quels (par exemple pour des graphiques). Donc il vaut mieux faire en sorte que cette agrégation ait lieu dans un second temps =&amp;gt; définition d&#039;une nouvelle fonction par exemple. &lt;br /&gt;
&lt;br /&gt;
En revanche, je pense que tu pourrais faire tourner ce calcul avant de &amp;quot;unnest&amp;quot; car tes séquences n&#039;ont pas des identifiants uniques en l&#039;état (les identifiants ne sont uniques que au sein des sous-jeux de données imbriqués)&lt;br /&gt;
&lt;br /&gt;
avec n_distinct, je chope le nb total de séquences&lt;br /&gt;
Pour choper la durée de la séquence la plus longue, tu suggérerais quoi ?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
... %&amp;gt;% &lt;br /&gt;
  group_by(sequence) %&amp;gt;%&lt;br /&gt;
  summarise(duration=max(time)-min(time)) %&amp;gt;%&lt;br /&gt;
  ungroup() %&amp;gt;%&lt;br /&gt;
  mutate(n_sequences=n()) %&amp;gt;%&lt;br /&gt;
  top_n(1,duration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le mutate (n_sequences=n()) te rajoute le nombre de séquences sans résumer (ça répète autant de fois que nécessaire la valeur n_sequences)&lt;br /&gt;
du coup après quand tu gardes que la top duration t&#039;as quand-même l&#039;info qu&#039;il te faut&lt;br /&gt;
== Annonces de nouveau packages R ==&lt;br /&gt;
&lt;br /&gt;
=== banqueHydro === &lt;br /&gt;
&lt;br /&gt;
[[https://github.com/lvaudor/banqueHydro]]&lt;br /&gt;
&lt;br /&gt;
Pour &amp;quot;scraper&amp;quot; les données du site banqueHydro (en attendant l&#039;API Hubeau [[https://github.com/BRGM/hubeau/projects]]).&lt;br /&gt;
&lt;br /&gt;
== Annonces de formations/tutos/conf ==&lt;br /&gt;
&lt;br /&gt;
supports SIGR [[https://sigr2021.github.io/site/index.html]] par defuneste&lt;/div&gt;</summary>
		<author><name>88.126.37.20</name></author>
	</entry>
	<entry>
		<id>https://isig-wiki.ens-lyon.fr/index.php?title=Questions-r&amp;diff=46</id>
		<title>Questions-r</title>
		<link rel="alternate" type="text/html" href="https://isig-wiki.ens-lyon.fr/index.php?title=Questions-r&amp;diff=46"/>
		<updated>2022-01-10T16:01:59Z</updated>

		<summary type="html">&lt;p&gt;88.126.37.20 : arrange question martiste&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cette page reprend la &amp;quot;substantifique moelle&amp;quot; des échanges ayant eu lieu sur le channel &#039;&#039;&#039;questions-r&#039;&#039;&#039; du Discord d&#039;ISIG.&lt;br /&gt;
&lt;br /&gt;
== Manipulation d&#039;un nom de fichier ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question posée par martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Comment récupérer un morceau du nom du fichier ? Par exemple à partir de &#039;&#039;&#039;&amp;quot;zarsqdfqsfd33vezre20618402.csv&#039;&#039;&#039; on veut récupérer &#039;&#039;&#039;20618402&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor et sdunesme&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Combi des &#039;&#039;&#039;expressions régulières&#039;&#039;&#039; et de la fonction &#039;&#039;&#039;basename()&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;za/rsqd/fqsfd33vezre20618402.csv&amp;quot; %&amp;gt;%&lt;br /&gt;
  basename() %&amp;gt;% # donne &amp;quot;fqsfd33vezre20618402.csv&amp;quot;&lt;br /&gt;
  stringr::str_replace(&amp;quot;.csv&amp;quot;,&amp;quot;&amp;quot;) %&amp;gt;% # donne &amp;quot;fqsfd33vezre20618402&amp;quot;&lt;br /&gt;
  stringr::str_extract(pattern=&amp;quot;.{8}(?=\\.$)&amp;quot;) # donne &amp;quot;20618402&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reformattage d&#039;un fichier en &amp;quot;longueur&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de mcottet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;ai une bdd avec plusieurs variables catégorielles qui portent une info similaire (est ce que les gens ont vu l&#039;espèce A un peu, bcp, passionnément, à la folie ; idem pour l&#039;espèce B, C...). Et j&#039;aimerais faire une somme pour savoir combien de fois l&#039;individu 1 a répondu un peu à l&#039;ensemble des espèces proposées, bcp à l&#039;ensemble des espèces...&lt;br /&gt;
il y a 18 espèces (donc 18 variables)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;tidyr::pivot_longer()&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dans ta version de BDD, tu as 18 variables différentes&lt;br /&gt;
Mais en fait, tu pourrais considérer que ces 18 colonnes correspondent en fait à 2 colonnes (une colonne &amp;quot;espece&amp;quot; et une colonne &amp;quot;valeur&amp;quot;)&lt;br /&gt;
Tu cherches de ce fait à répéter l&#039;ensemble des autres colonnes (toutes celles qui ne font pas partie des 18 sus-mentionnées) 18 fois, mais &amp;quot;en hauteur&amp;quot;.&lt;br /&gt;
Du coup, ton tableau qui est &amp;quot;plutôt large&amp;quot; devient un tableau &amp;quot;plutôt long&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dans l&#039;appel à la fonction, tu précises quelles sont les variables que tu récupères pour les mettre &amp;quot;en long&amp;quot;&lt;br /&gt;
et toutes les autres, il les répète à l&#039;identique autant de fois que nécessaire&lt;br /&gt;
&lt;br /&gt;
A une époque, ça s&#039;appelait pas pivot_wider() et pivot_longer() mais spread() et gather()&lt;br /&gt;
(mais c&#039;était moins explicite comme nom)&lt;br /&gt;
&lt;br /&gt;
== Complétion des données d&#039;une série temporelle ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de Théo&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
j&#039;ai une série temporelle de hauteurs d&#039;eau à pas de temps 15 min, mais il y a plein de trous dedans et je voudrais la compléter, en ajoutant l&#039;heure manquante, et la hauteur d&#039;eau manquante (moyenne de t-15 et t+15 si t est la valeur manquante). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
il faut que tu commences par te créer un index de temps à l&#039;intervalle voulu, depuis ta première valeur jusqu&#039;à la dernière, à laquelle tu joins ton jeu de données réel. Les trous vont alors apparaître en &#039;NA&#039;. Et si tu n&#039;as que quelques trous de jamais plus de 2 intervalles, tu peux utiliser la fonction zoo::na_approx() qui fera l&#039;affaire...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
library(dplyr)&lt;br /&gt;
H_15_raw = readr::read_delim(&amp;quot;H_15MIN_SB_CSV.csv&amp;quot;, delim = &amp;quot;;&amp;quot;) %&amp;gt;% &lt;br /&gt;
  mutate(Date = lubridate::dmy_hm(Date))&lt;br /&gt;
&lt;br /&gt;
timestamp = seq(from = min(H_15_raw$Date), to = max(H_15_raw$Date), by = &amp;quot;15 min&amp;quot;) %&amp;gt;% &lt;br /&gt;
  as_tibble() %&amp;gt;% &lt;br /&gt;
  select(Date = value)&lt;br /&gt;
&lt;br /&gt;
H_15_corr =&lt;br /&gt;
  left_join(timestamp, H_15_raw, by =&amp;quot;Date&amp;quot;) %&amp;gt;% &lt;br /&gt;
  mutate(H_CM_SB_BH = zoo::na.approx(H_CM_SB_BH))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regarde ?na.approx pour plus de détails sur son fonctionnement&lt;br /&gt;
&lt;br /&gt;
== Programmation fonctionnelle ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Question de martiste&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
J&#039;ai un jeu de données avec des températures à pas de temps horaire, le tout sur plusieurs années (et plusieurs stations). J&#039;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&#039;aurais créé un nouveau champ pour lequel j&#039;incrémente une valeur de séquence à chaque fois que T&amp;gt;19 et que T-1&amp;lt;19. Je regarde la valeur max de ma séquence, et la longueur max de ces séquences également. Mais comment faire sans boucle ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Réponse de lvaudor&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
get_sequences=function(donnees, Temp){&lt;br /&gt;
  result = donnees %&amp;gt;% &lt;br /&gt;
    mutate(change = case_when(chmes_valeur &amp;gt; Temp &amp;amp; lag(chmes_valeur &amp;lt;= Temp) ~ 1,&lt;br /&gt;
                              TRUE ~ 0)) %&amp;gt;% &lt;br /&gt;
    mutate(sequence = case_when(chmes_valeur &amp;gt; Temp ~ cumsum(as.numeric(change)),&lt;br /&gt;
                                TRUE ~ NA_real_))&lt;br /&gt;
  return(result)&lt;br /&gt;
}&lt;br /&gt;
result= dat %&amp;gt;% &lt;br /&gt;
  group_by(chmes_coderhj,chmes_anneebiol) %&amp;gt;% &lt;br /&gt;
  tidyr::nest() %&amp;gt;% &lt;br /&gt;
  mutate(data=purrr::map(data,get_sequences,Temp=19)) %&amp;gt;% &lt;br /&gt;
  tidyr::unnest(cols=c(data))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou bien (autre syntaxe possible pour map), comme ça:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;r&amp;quot;&amp;gt;&lt;br /&gt;
result= dat %&amp;gt;% &lt;br /&gt;
  group_by(chmes_coderhj,chmes_anneebiol) %&amp;gt;% &lt;br /&gt;
  tidyr::nest() %&amp;gt;% &lt;br /&gt;
  mutate(data=purrr::map(data,~get_sequences(.,Temp=19))) %&amp;gt;% &lt;br /&gt;
  tidyr::unnest(cols=c(data))&lt;br /&gt;
&lt;br /&gt;
Différence entre avec et sans &#039;~&#039; devant la fonction:&lt;br /&gt;
&lt;br /&gt;
* soit map attend le nom d&#039;une fonction&lt;br /&gt;
: Dans ce cas l&#039;argument sur lequel il itère doit être le premier argument de la fonction&lt;br /&gt;
* soit map attend une formule (précédée d&#039;un &amp;quot;~&amp;quot;, donc)&lt;br /&gt;
: Dans ce cas il y a un peu plus de souplesse sur la position de l&#039;argument sur lequel on itère&lt;br /&gt;
&lt;br /&gt;
Tu pourrais dire ~ get_sequences(data, Temp=.) pour itérer sur une variable qui donnerait un seuil de température, par exemple&lt;br /&gt;
et non plus itérer sur le premier argument, &amp;quot;data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Si tu donnes le nom de la fonction, tu peux quand-même rajouter des arguments &amp;quot;secondaires&amp;quot;&lt;br /&gt;
mais tu les rajoutes directement comme arguments optionnels à la fonction &amp;quot;map&amp;quot;, pas dans un simulacre d&#039;appel à la fonction que tu itères&lt;br /&gt;
&lt;br /&gt;
L&#039;utilisation des formules c&#039;est un subtilité introduite pour gérer les fonctions qui n&#039;ont pas les arguments &amp;quot;dans l&#039;ordre le plus pratique au regard de ce qu&#039;on souhaite faire&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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&#039;inclure dans la fct &#039;get_sequences&#039;, ou de repartir des résultats de cette fonction et d&#039;alimenter une nouvelle ?&lt;br /&gt;
LiseV — 23/08/2021&lt;br /&gt;
ben pour le coup, le nombre de total de séquences et la durée de la séquence la plus longue, ce sont des &amp;quot;agrégations&amp;quot; de ce que tu as fait avant. &lt;br /&gt;
Or, il est possible que tu veuilles utiliser les résultats de get_sequences tels quels (par exemple pour des graphiques) &lt;br /&gt;
donc il vaut mieux faire en sorte que cette agrégation ait lieu dans un second temps&lt;br /&gt;
=&amp;gt; définition d&#039;une nouvelle fonction par exemple&lt;br /&gt;
En revanche, je pense que tu pourrais faire tourner ce calcul avant de &amp;quot;unnest&amp;quot; &lt;br /&gt;
car tes séquences n&#039;ont pas des identifiants uniques en l&#039;état&lt;br /&gt;
(les identifiants ne sont uniques que au sein des sous-jeux de données imbriqués)&lt;br /&gt;
martiste — 23/08/2021&lt;br /&gt;
Yes&lt;br /&gt;
martiste — 23/08/2021&lt;br /&gt;
avec n_distinct, je chope le nb total de séquences&lt;br /&gt;
Pour choper la durée de la séquence la plus longue, tu suggérerais quoi ?&lt;br /&gt;
LiseV — 23/08/2021&lt;br /&gt;
tu calcules les durées pour toutes les séquences, puis tu calcules le max&lt;br /&gt;
hihi&lt;br /&gt;
bon j&#039;imagine que si tu me poses cette question, c&#039;est que le calcul des durées pose pb?&lt;br /&gt;
max(time)-min(time) fait pas le job?&lt;br /&gt;
en ayant formatté time avec lubridate?&lt;br /&gt;
(je dis &amp;quot;time&amp;quot; mais remplace par le nom de variable ad hoc  😉 )&lt;br /&gt;
martiste — 23/08/2021&lt;br /&gt;
Ah, j&#039;étais parti sur complétement autre chose du coup....&lt;br /&gt;
LiseV — 23/08/2021&lt;br /&gt;
ben, group_by(sequence) %&amp;gt;% summarise(duration=max(time)-min(time)) me semble l&#039;option la plus évidente a priori?&lt;br /&gt;
et même group_by(sequence) %&amp;gt;% summarise(duration=max(time)-min(time)) %&amp;gt;% top_n(1,duration), pour aller vraiment au bout du process&lt;br /&gt;
martiste — 23/08/2021&lt;br /&gt;
Et tu peux rajouter un &#039;group_by&#039; au sein d&#039;un &#039;summarise&#039; ?&lt;br /&gt;
LiseV — 23/08/2021&lt;br /&gt;
??&lt;br /&gt;
tu peux faire group_by %&amp;gt;% mutate %&amp;gt;% ungroup() %&amp;gt;% group_by(autre chose) %&amp;gt;% summarise&lt;br /&gt;
mais je sais pas si ça répond à ta question&lt;br /&gt;
martiste — 23/08/2021&lt;br /&gt;
J&#039;essaie de mettre les deux dans une même fonction, c&#039;est pour ça&lt;br /&gt;
summarise(n = n_distinct(sequence, na.rm = TRUE))&lt;br /&gt;
et&lt;br /&gt;
group_by(sequence) %&amp;gt;% summarise(duration=max(time)-min(time)) %&amp;gt;% top_n(1,duration)&lt;br /&gt;
LiseV — 23/08/2021&lt;br /&gt;
Là tu pourrais faire  group_by(sequence) %&amp;gt;% summarise(duration=max(time)-min(time)) %&amp;gt;% ungroup() %&amp;gt;% mutate(n_sequences=n()) %&amp;gt;% top_n(1,duration)&lt;br /&gt;
martiste — 23/08/2021&lt;br /&gt;
Qui ne se font pas au même niveau de groupage&lt;br /&gt;
Okay, yé test ça tout dé souite&lt;br /&gt;
LiseV — 23/08/2021&lt;br /&gt;
le mutate (n_sequences=n()) te rajoute le nombre de séquences sans résumer (ça répète autant de fois que nécessaire la valeur n_sequences)&lt;br /&gt;
du coup après quand tu gardes que la top duration t&#039;as quand-même l&#039;info qu&#039;il te faut&lt;br /&gt;
martiste — 23/08/2021&lt;br /&gt;
Ahh, okay je vois. Mais il faut que j&#039;enlève tous mes &#039;NA&#039;s, parce que c&#039;est eux les &#039;top duration&#039; pour le moment... 😉&lt;br /&gt;
LiseV — 23/08/2021&lt;br /&gt;
ah oui effectivement 🙂&lt;br /&gt;
martiste — 23/08/2021&lt;br /&gt;
pfiou ! Je crois que j&#039;ai réussi&lt;br /&gt;
LiseV — 23/08/2021&lt;br /&gt;
🎆&lt;br /&gt;
martiste — 23/08/2021&lt;br /&gt;
Okay, la fonction &#039;top_n()&#039;, elle prend le premier élément d&#039;un vecteur ordonné ? Ou elle prend la valeur max, et donc s&#039;il y en a plusieurs identiques, elle va en sortir plusieurs ?&lt;br /&gt;
LiseV — 23/08/2021&lt;br /&gt;
non elle prend le max&lt;br /&gt;
c&#039;est pour ça que tu lui précises aussi une variable &lt;br /&gt;
pour lui dire le max en terme de quoi&lt;br /&gt;
martiste — 23/08/2021&lt;br /&gt;
Mmh, okay, c&#039;est pour ça que j&#039;ai des doublons&lt;br /&gt;
martiste — 23/08/2021&lt;br /&gt;
Est-ce qu&#039;il existe un moyen plus rapide de joindre plus de 2 tables que de répéter des jointures successives ?&lt;br /&gt;
(et plus élégant, au passage)&lt;br /&gt;
&lt;br /&gt;
== Annonces de nouveau packages R ==&lt;br /&gt;
&lt;br /&gt;
=== banqueHydro === &lt;br /&gt;
&lt;br /&gt;
[[https://github.com/lvaudor/banqueHydro]]&lt;br /&gt;
&lt;br /&gt;
Pour &amp;quot;scraper&amp;quot; les données du site banqueHydro (en attendant l&#039;API Hubeau [[https://github.com/BRGM/hubeau/projects]]).&lt;br /&gt;
&lt;br /&gt;
== Annonces de formations/tutos/conf ==&lt;br /&gt;
&lt;br /&gt;
supports SIGR [[https://sigr2021.github.io/site/index.html]] par defuneste&lt;/div&gt;</summary>
		<author><name>88.126.37.20</name></author>
	</entry>
</feed>