Un data frame est une liste de colonnes
Un data frame est le tableau de R : des lignes d'observations, des colonnes de variables. C'est le tableur de R, et la forme sous laquelle arrivent pratiquement toutes les données réelles - une ligne par personne, par mesure, par transaction ; une colonne par attribut.
Structurellement, un data frame est une liste de vecteurs de même longueur, avec un comportement lignes/colonnes par-dessus. Ce seul fait explique l'essentiel de ses règles : chaque colonne a un type unique (c'est un vecteur), des colonnes différentes peuvent avoir des types différents (c'est une liste), et chaque colonne doit avoir la même longueur (c'est la partie « frame », le cadre).
Tu en construis un en donnant des vecteurs nommés à data.frame() :
Du texte, des nombres et des logiques côte à côte - le mélange qu'une matrice ne peut pas contenir. En pratique tu taperas rarement des données à la main comme ça ; les tableaux arrivent généralement via read.csv ou une base de données. Mais tout ce qui suit s'applique à l'identique quelle que soit la provenance du data frame.
Prendre la mesure d'un data frame
Ne calcule jamais sur un jeu de données que tu n'as pas regardé. La trousse d'inspection de R est courte et mérite de devenir un réflexe :
str()est la première à lancer sur toute donnée fraîchement chargée : une ligne par colonne avec son type et ses premières valeurs. C'est là que tu attrapes la colonne de « nombres » lue en réalité comme du texte à cause d'une entrée égarée.nrow()/ncol()donnent les dimensions ;names()liste les noms de colonnes.summary()donne des statistiques par colonne - min/médiane/moyenne/max pour les nombres, effectifs pour les logiques et les facteurs.head(df)ettail(df)affichent les six premières et les six dernières lignes - indispensables dès que les vrais jeux de données deviennent trop grands pour s'afficher en entier. Tu verrashead()à l'œuvre plus bas sur un jeu de données intégré.
Trois façons d'obtenir une colonne
L'accès aux colonnes est l'opération de base, et R te donne trois écritures :
people$age- la forme du quotidien : courte, lisible, avec autocomplétion dans la plupart des éditeurs.people[["age"]]- résultat identique, mais le nom peut venir d'une variable (col <- "age"; people[[col]]), ce que$ne sait pas faire. Préfère-la dans les fonctions.people[, "age"]- style matrice : les lignes avant la virgule (vide = toutes), les colonnes après.
Les trois renvoient la colonne sous forme de vecteur simple, prêt pour mean(people$age). La quatrième écriture de l'extrait est le piège : people["age"] avec des crochets simples renvoie un data frame à une colonne, pas un vecteur - la même distinction [ / [[ que pour les listes, parce qu'un data frame est une liste. Si une fonction mathématique se plaint que ton entrée n'est pas numérique, vérifie tes crochets.
Lignes et cellules
La notation [ligne, colonne] atteint n'importe quelle tranche du tableau :
people[2, ] est toute la deuxième ligne (sous forme de data frame à une ligne - les lignes gardent leur cadre, puisqu'elles mélangent les types). people[2, "name"] est une seule cellule. Un vecteur de numéros de lignes en extrait plusieurs.
La dernière ligne est l'importante : une condition logique sur une colonne sélectionne des lignes - ici, tous ceux de plus de 28 ans. Ce motif de masquage des lignes est le fondement de tout le filtrage de données en R, et il mérite son propre article : voir filtrer et extraire pour le traitement complet, y compris subset() et les filtres multi-conditions.
Ajouter et retirer des colonnes
Comme un data frame est une liste de colonnes, les colonnes vont et viennent par simple affectation :
Affecter à un nouveau nom ajoute la colonne ; le vecteur doit correspondre à nrow() (ou être de longueur 1, auquel cas il est recyclé pour remplir toutes les lignes). Le second ajout montre le geste idiomatique : de nouvelles colonnes calculées à partir de colonnes existantes, avec du calcul vectorisé sur toute la colonne d'un coup. Affecter NULL supprime entièrement une colonne.
Les valeurs d'une colonne peuvent être écrasées de la même façon - people$age <- people$age + 1 fait vieillir tout le monde d'un an.
Jeux de données intégrés, et un mot sur les tibbles
R est livré avec des jeux de données d'entraînement préchargés, donc tu peux tout essayer ci-dessus sans rien importer. Les deux que tu croiseras dans tous les tutoriels sont mtcars (32 voitures, 11 variables numériques) et iris (150 fleurs, 4 mesures plus une espèce en facteur) :
head() gagne sa place : six lignes te disent la forme de la chose sans inonder l'écran. Ces jeux de données sont des terrains de jeu idéaux - quand tu ne sais pas comment se comporte une fonction, teste-la sur mtcars avant de la pointer sur tes propres données.
Un terme que tu croiseras dès que tu toucheras au tidyverse : le tibble, la version tidyverse du data frame. Même concept, comportement plus poli - l'affichage ne montre que les dix premières lignes avec les types de colonnes, et il n'y a pas d'appariement partiel des noms. Créé avec tibble() ou renvoyé par les fonctions readr/dplyr :
library(tibble)
tibble(name = c("Rosa", "Ken"), age = c(30, 41))
#> # A tibble: 2 x 2
#> name age
#> <chr> <dbl>
#> 1 Rosa 30
#> 2 Ken 41
Tout ce qui est dans cet article - $, str(), l'ajout de colonnes, les masques logiques de lignes - fonctionne tel quel sur les tibbles. Un tibble est un data frame avec un vernis supplémentaire ; apprends les data frames et tu as appris les deux.
Ce que tu retiens
- Un data frame est une liste de colonnes de même longueur : un type par colonne, des types mélangés à travers le tableau - le tableur de R.
- Inspecte avant de calculer :
str()d'abord, puishead(),summary(),nrow()/ncol()/names(). df$col,df[["col"]]etdf[, "col"]renvoient tous une colonne sous forme de vecteur ;df["col"]à crochet simple renvoie un data frame.df[lignes, colonnes]découpe n'importe quoi ; un masque logique avant la virgule filtre les lignes.- Ajoute des colonnes par affectation (souvent calculées à partir d'autres colonnes) ; retire avec
NULL; entraîne-toi surmtcars.
Prochaine étape : les valeurs manquantes - ce que signifie NA, pourquoi il se propage dans les calculs, et comment le gérer.
Questions fréquentes
Comment créer un data frame en R ?
Passe des vecteurs nommés de même longueur à data.frame() : df <- data.frame(name = c("Rosa", "Ken"), age = c(30, 41)). Chaque vecteur devient une colonne. En pratique, la plupart des data frames ne sont pas tapés à la main - ils arrivent de read.csv() ou d'une base de données - mais la structure est la même.
Comment accéder à une colonne d'un data frame R ?
Trois façons : df$age (rapide et lisible), df[["age"]] (même résultat, marche quand le nom de la colonne est stocké dans une variable) et df[, "age"] (style matrice). Les trois renvoient la colonne sous forme de vecteur simple. df["age"] avec des crochets simples renvoie plutôt un data frame à une colonne - une source fréquente de confusion.
Qu'affiche str() pour un data frame ?
Une ligne par colonne : son nom, son type et les premières valeurs, plus le nombre de lignes et de colonnes en tête. C'est le moyen le plus rapide de voir si une colonne a été lue comme numérique ou comme texte, et c'est pourquoi str() devrait être la première chose que tu lances sur tout jeu de données fraîchement chargé.
Comment ajouter une colonne à un data frame en R ?
Affecte à un nom qui n'existe pas encore : df$score <- c(88, 75, 93). Le vecteur doit correspondre au nombre de lignes (ou être de longueur 1, auquel cas il est recyclé sur toutes les lignes). Supprime une colonne en lui affectant NULL : df$score <- NULL.