Créer une nouvelle colonne sur la base d'une colonne existante

Dans certains contextes, on peut vouloir ajouter une colonne sur la base d'une colonne existante non pas suite à une division de son contenu, mais sur d'autres critères. Par exemple, dans le jeu de données utilisé en exemple, on pourrait vouloir ajouter une colonne indiquant le niveau d'avancement de carrière. Ce dernier pourrait en effet être déduit de la colonne Titre.

  1. Cliquez sur l'icône du triangle à gauche de l'entête Titre, cliquez sur Éditer la colonne et choisissez l'option Ajouter une colonne en fonction de cette colonne...

    1. Vous devriez alors voir s'ouvrir la fenêtre de dialogue Ajouter une colonne en fonction d'une colonne Titre qui comporte plusieurs éléments à compléter en fonction de ce que vous désirez faire (voir, au besoin, l'écran commenté pour cette fenêtre).

  2. Complétez la fenêtre de dialogue afin d'arriver à générer une nouvelle colonne où 1 est indiqué s'il s'agit d'un.e professeur.e adjoint.e, 2 est indiqué s'il s'agit d'un.e professeur.e agrégé.e et 3 est indiqué s'il s'agit d'un.e professeur.e titulaire.

    Truc & astuce

    La copie d'écran ci-dessus illustre les éléments à indiquer dans la fenêtre de dialogue. Le nerf de la guerre réside dans la construction de l'expression nécessaire pour y arriver. La tâche à première vue, si vous débutez dans ce type d'exercice, peut paraître ardue. Un truc est de commencer en essayant de dire en mots ce que l'on veut faire. Dans ce cas-ci, il s'agit (1) de regarder si on retrouve la chaîne "adjoint" dans la colonne de départ, et (2) d'afficher 1 si c'est le cas et, si ce n'est pas le cas, ensuite voir si on retrouve la chaîne "agrégé" auquel cas on met 2 sinon on met 3. Par la suite, il faut traduire ce que vous avez dit en langage naturel dans le langage que comprendra OpenRefine, GREL :

    1. La première étape, soit de regarder si on retrouve une certaine chaîne dans la colonne de départ, correspond à une fonction textuelle (string en anglais). Comme vous pouvez le voir dans la documentation d'OpenRefine, on retrouve dans GREL différentes familles de fonctions. Ces familles sont des regroupements très classiques dans plusieurs environnements, les fonctions proposées étant propres aux types de données à traiter. Il faut donc repérer dans la liste des fonctions textuelles celle qui permet de vérifier si on retrouve une chaîne de texte dans une cellule. C'est ici la fonction contains qui fera le travail. Cette dernière comporte deux arguments (c'est-à-dire deux paramètres), indiqués dans sa parenthèse, soit (1) l'endroit où on veut faire la recherche, et (2) la chaîne à y chercher. Le mot-clé "value" dans OpenRefine représente la valeur de la colonne originale. Donc, en GREL, cela revient à contains(value, "adjoint"). Il est important de bien comprendre ce que retourne une fonction. La fonction contains retournera Vrai si la chaîne recherchée se retrouve bien dans la colonne de départ et Faux sinon.

    2. La deuxième étape, soit de préciser ce que l'on affiche en fonction du résultat de la première étape, repose sur une condition : si la chaîne y est, alors 1, sinon faire une autre vérification. Il s'agit d'une fonction conditionnelle qui permet de contrôler ce qui est affiché en fonction d'une certaine valeur. Dans GREL, ce type de fonction se retrouve dans la famille des fonctions de contrôle (controls), et c'est la fonction if. Cette fonction possède trois arguments : (1) une condition qui se trouve être une expression qui retourne Vrai ou Faux, (2) ce qu'il faut faire si la condition est vraie, (3) ce qu'il faut faire si la condition est fausse. Dans cet exemple, la condition se trouve être la première étape ci-dessus, soit l'utilisation de la fonction contains! Donc, en GREL, cela revient à if(contains(value, "adjoint"), 1, autre vérification).

    3. Finalement, comme il y a une deuxième vérification à faire pour distinguer entre le cas "agrégé" et le cas "titulaire", il faut faire une autre vérification. La logique sera la même. Si on retrouve "agrégé", on écrit 2, sinon on écrit 3, ce qui se traduit en GREL par if(contains(value, "agrégé"), 2, 3). Il s'agit de remplacer, dans l'expression trouvée à la deuxième étape, "autre vérification" par cette nouvelle fonction. Au final, l'expression complète à utiliser sera if(contains(value, "adjoint"), 1, (if(contains(value, "agrégé"), 2, 3))).

    1. Après avoir cliqué sur Ok, OpenRefine appliquera le traitement demandé et vous verrez s'ajouter la colonne Avancement dans votre table de données :

  3. Résultat

    Truc & astuce

    L'ajout d'une colonne dont le contenu est lié à celui d'une autre colonne peut permettre d'enrichir une table de données. Le langage GREL permet de faire des traitements qui peuvent aller de très simples à très complexes, offrant un éventail de possibilités très intéressantes. Il est même possible d'exploiter des données qui se trouvent dans un autre projet! Imaginez que vous ayez créé un projet à partir d'un jeu de données où les titres des postes se retrouvent associés à des codes (vous avez nommé ce projet codes titres) :

    Il serait ainsi possible de rapatrier les codes pour les titres dans votre jeu de données en demandant d'ajouter une colonne à partir de la colonne Titre en configurant ainsi l'ajout :

    C'est la fonction GREP cell.cross qui permet de "joindre" deux projets. Les deux premiers arguments précisent le nom du projet lié (ici "codes titres") ainsi que le nom de la colonne qui sert de pivot, c'est-à-dire de joint entre les deux projets (ici "Titre"). Le troisième argument indique la colonne du projet lié à utiliser comme contenu (ici cells["Code"].value[0]).