Menu

Ajouter et transformer des colonnes en R (mutate et R de base)

Comment ajouter, transformer et supprimer des colonnes de data frame : df$new <- ..., ifelse() pour les colonnes conditionnelles, transform(), et le mutate() de dplyr avec case_when().

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Ajouter une colonne : df$new <- valeur

Pour ajouter une colonne en R de base, affecte à un nom qui n'existe pas encore. La valeur est généralement calculée à partir de colonnes qui existent :

Deux choses se sont passées. orders$total a reçu un vecteur complet - price * qty est calculé pour chaque ligne d'un coup, parce que l'arithmétique en R est vectorisée. orders$currency a reçu une valeur unique, que R a recyclée sur les quatre lignes. Toute autre longueur est une erreur (replacement has 3 rows, data has 4), c'est R qui te protège d'une colonne mal alignée.

Ça marche parce qu'un data frame est une liste de colonnes de longueur égale - affecter un nouvel élément nommé fait grandir la liste. La doc sur les data frames décortique ce modèle.

Colonnes conditionnelles : ifelse()

Une colonne dont la valeur dépend d'une condition appelle ifelse() - le cousin vectorisé de if. Il prend un vecteur entier de conditions et renvoie une valeur par ligne :

Pourquoi pas un simple if ? Parce que if évalue exactement un TRUE/FALSE - face à une colonne, il plante (the condition has length > 1). ifelse(test, yes, no) vérifie chaque élément et choisit ligne par ligne. Pour trois issues ou plus, tu peux imbriquer :

Imbriquer sur deux niveaux, ça va ; trois ou plus tourne à la pyramide - c'est exactement le boulot pour lequel le case_when() de dplyr (ci-dessous) a été conçu. Le if/else à valeur unique est couvert dans la doc if-else.

Plusieurs colonnes à la fois : transform()

Le transform() de R de base ajoute plusieurs colonnes en un appel, avec des noms de colonnes nus :

Note que transform() renvoie un nouveau data frame - tu dois réaffecter le résultat, alors que df$new <- ... modifie sur place. Une limitation : les expressions au sein d'un même appel transform() ne se voient pas entre elles, donc discount = ifelse(total > 50, ...) échoue là (total n'existe pas encore). Fais-le en deux étapes - ou avec mutate(), qui le permet.

Modifier vs créer

La même syntaxe d'affectation écrase une colonne existante - que la colonne ait déjà existé est la seule différence :

Ça mérite qu'on s'y arrête : R ne t'avertit pas quand tu écrases une colonne. Une coquille comme df$prise <- round(df$price, 2) crée silencieusement une nouvelle colonne au lieu de corriger l'ancienne. Après une transformation, fais un print() ou un str() du data frame et confirme que tu as bien changé ce que tu voulais.

Supprimer une colonne

Affecte NULL pour supprimer :

La colonne a disparu, sans cérémonie. Pour en supprimer plusieurs, df[, c("a", "b")] (garde ce que tu listes) est généralement plus clair que des NULL répétés.

La méthode dplyr : mutate()

Le verbe dplyr pour tout ce qui précède est mutate(). Les extraits ci-dessous sont statiques - le bac à sable n'exécute que R de base - mais voici à quoi ressemblent les mêmes opérations :

library(dplyr)

orders |>
    mutate(
        total    = price * qty,
        big      = total > 50        # can use total, defined one line up
    )

Deux avantages sur R de base. D'abord, les colonnes définies dans le même mutate() peuvent se référencer entre elles, dans l'ordre - la chose que transform() refuse. Ensuite, les helpers conditionnels sont meilleurs que des ifelse() imbriqués :

students |>
    mutate(
        grade = if_else(score >= 60, "pass", "fail"),
        band  = case_when(
            score >= 85 ~ "high",
            score >= 60 ~ "mid",
            .default    = "low"
        )
    )

if_else() est un ifelse() plus strict (les deux branches doivent être du même type - ça attrape de vrais bugs). case_when() se lit comme une liste à plat de paires condition ~ valeur vérifiées de haut en bas, avec .default comme filet de sécurité - le remplacement lisible de la pyramide de ifelse(). Comme chaque verbe dplyr, mutate() renvoie un nouveau data frame ; vois l'intro à dplyr pour la façon dont il s'enchaîne avec le reste.

Ce que tu retiens

  • df$new <- expression ajoute une colonne ; l'expression s'exécute pour toutes les lignes d'un coup.
  • ifelse(test, yes, no) construit des colonnes conditionnelles ; un simple if ne le peut pas.
  • transform() ajoute plusieurs colonnes par appel mais elles ne se voient pas entre elles ; mutate() le permet.
  • La même affectation écrase silencieusement - vérifie ton orthographe après une transformation.
  • df$col <- NULL supprime une colonne ; case_when() remplace les pyramides de ifelse() imbriqués.

Prochaine étape : renommer des colonnes - names(), l'idiome de base robuste, et le rename() de dplyr.

Questions fréquentes

Comment ajouter une nouvelle colonne à un data frame en R ?

Affecte à un nom de colonne qui n'existe pas encore : df$total <- df$price * df$qty. R crée la colonne sur-le-champ. La valeur peut être une valeur unique (recyclée sur chaque ligne) ou un vecteur calculé à partir d'autres colonnes, tant que sa longueur correspond au nombre de lignes.

Comment créer une colonne conditionnelle en R ?

Utilise le ifelse() vectorisé : df$grade <- ifelse(df$score >= 60, "pass", "fail") vérifie toutes les lignes d'un coup. N'utilise pas un simple if - il gère une seule condition, pas une colonne. Pour plus de deux issues, imbrique des appels ifelse() ou utilise le case_when() de dplyr.

Que fait mutate() en R ?

mutate() est le verbe dplyr pour ajouter ou transformer des colonnes : df |> mutate(total = price * qty) renvoie une copie du data frame avec la nouvelle colonne. Il peut définir plusieurs colonnes en un seul appel, et les colonnes suivantes peuvent utiliser celles définies plus haut dans le même mutate.

Comment supprimer une colonne d'un data frame en R ?

Affecte-lui NULL : df$notes <- NULL supprime la colonne sur place. En dplyr, select(-notes) renvoie une copie sans elle.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER