Dans ce didacticiel, vous apprendrez l'une des opérations les plus courantes utilisées pour manipuler des DataFrames dans R - l'ajout de colonnes.
Un DataFrame est l'une des structures de données de base du langage de programmation R. C'est également une structure de données très polyvalente car elle peut stocker plusieurs types de données, être facilement modifiée et facilement mise à jour.
Dans ce didacticiel, nous examinerons l'une des opérations les plus courantes utilisées pour manipuler des DataFrames dans R : comment ajouter une colonne à un DataFrame dans la base R.
Qu'est-ce qu'une Dataframe en R ?
Techniquement parlant, un DataFrame dans R est un cas spécifique deune liste de vecteurs de même longueur, où différents vecteurs peuvent être (et sont généralement) de différents types de données. Puisqu'un DataFrame a une forme tabulaire à 2 dimensions, il a des colonnes (variables) et des lignes (entrées de données).
Ajouter une colonne à un DataFrame dans R
On peut vouloir ajouter une nouvelle colonne à un R DataFrame pour diverses raisons : pour calculer une nouvelle variable basée sur celles existantes, pour ajouter une nouvelle colonne basée sur celle disponible mais avec un format différent (en gardant ainsi les deux colonnes) , pour ajouter une colonne vide ou d'espace réservé pour la remplir davantage, pour ajouter une colonne contenant des informations complètement nouvelles.
Explorons différentes manières d'ajouter une nouvelle colonne à un DataFrame dans R. Pour nos expériences, nous utiliserons principalement le même DataFrame appelésuper_dormeurs
que nous reconstruirons à chaque fois à partir du DataFrame initial suivant :
super_sleepers_initial <- data.frame(rating=1:4, animal=c('koala', 'hedgehog', 'sloth', 'panda'), country=c('Australie', 'Italie', 'Pérou', 'Chine'))print(super_sleepers_initial)
note pays animal1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda Chine
Notre tâche sera d'ajouter à ce DataFrame une nouvelle colonne appeléeavg_sleep_hours
représentant le temps moyen en heures que chacun des animaux ci-dessus dort par jour, selon le schéma suivant :
Animal | Heures de sommeil en moyenne par jour |
---|---|
koala | 21 |
hérisson | 18 |
paresseux | 17 |
Panda | dix |
Pour certains exemples, nous allons essayer d'ajouter deux autres colonnes :avg_sleep_hours_per_year
eta_queue
.
Maintenant, plongeons dedans.
Ajout d'une colonne à un DataFrame dans R à l'aide du symbole \$
Puisqu'un DataFrame dans R est une liste de vecteurs où chaque vecteur représente une colonne individuelle de ce DataFrame, nous pouvons ajouter une colonne à un DataFrame simplement en ajoutant le nouveau vecteur correspondant à cette "liste". La syntaxe est la suivante :
dataframe_name$new_column_name <- vecteur
Reconstruisons notresuper_dormeurs
DataFrame de l'initialesuper_sleepers_initial
DataFrame (nous le ferons pour chaque expérience ultérieure) et ajoutez-y une colonne appeléeavg_sleep_hours
représenté par le vecteurc(21, 18, 17, 10)
:
# Reconstruire lesuper_dormeurs
DataFramesuper_sleepers <- super_sleepers_initialprint(super_sleepers)cat('\n\n') # impression d'une ligne vide# Ajout d'une nouvelle colonneavg_sleep_hours
ausuper_dormeurs
DataFramesuper_sleepers$avg_sleep_hours <- c(21, 18, 17, 10)print(super_sleepers)
note pays animal1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda Chine note pays animal avg_sleep_hours1 1 koala Australie 212 2 hérisson Italie 183 3 paresseux Pérou 174 4 panda Chine 10
Notez que le nombre d'éléments ajoutés dans le vecteur doit être égal au nombre actuel de lignes dans un DataFrame, sinon le programme génère une erreur :
# Reconstruire lesuper_dormeurs
DataFramesuper_sleepers <- super_sleepers_initialprint(super_sleepers)cat('\n\n')# Tentative d'ajout d'une nouvelle colonneavg_sleep_hours
ausuper_dormeurs
DataFrame# avec le nombre d'éléments dans le vecteur NON ÉGAL au nombre de lignes dans le DataFramesuper_sleepers$avg_sleep_hours <- c(21, 18, 17)print(super_sleepers)
note animal pays1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda ChineErreur dans$<-.data.frame
(*tmp*
, avg_sleep_hours, value = c(21, 18, : le remplacement a 3 lignes, les données ont 4Traceback:1.$<-
(*tmp*
, avg_sleep_hours, valeur = c(21, 18, 17))2.$<-.data.frame
(*tmp*
, avg_sleep_hours, valeur = c(21, 18, . 17))3. stop(sprintf(ngettext(N, "replacement has %d row, data has %d", . "replacement has %d rows, data has %d"), N, nrows), domain = NA)
Au lieu d'attribuer un vecteur, nous pouvons attribuer une seule valeur, qu'elle soit numérique ou caractère, pour toutes les lignes d'une nouvelle colonne :
# Reconstruire lesuper_dormeurs
DataFramesuper_sleepers <- super_sleepers_initialprint(super_sleepers)cat('\n\n')# Ajout d'une nouvelle colonneavg_sleep_hours
ausuper_dormeurs
DataFrame et en l'attribuant à 0super_sleepers$avg_sleep_hours <- 0print(super_sleepers)
note pays animal1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda Chine note pays animal avg_sleep_hours1 1 koala Australie 02 2 hérisson Italie 03 3 paresseux Pérou 04 4 panda Chine 0
Dans ce cas, la nouvelle colonne joue un rôle d'espace réservé pour les valeurs réelles du type de données spécifié (dans le cas ci-dessus, numérique) que nous pouvons insérer ultérieurement.
Alternativement, nous pouvons calculer une nouvelle colonne basée sur celles existantes. Ajoutons d'abord leavg_sleep_hours
colonne à notre DataFrame puis calculer une nouvelle colonneavg_sleep_hours_per_year
à partir de cela. Nous voulons savoir combien d'heures ces animaux dorment en moyenne par an :
# Reconstruire lesuper_dormeurs
DataFramesuper_sleepers <- super_sleepers_initialprint(super_sleepers)cat('\n\n')# Ajout d'une nouvelle colonneavg_sleep_hours
ausuper_dormeurs
DataFramesuper_sleepers$avg_sleep_hours <- c(21, 18, 17, 10)print(super_sleepers)cat('\n\n')# Ajout d'une nouvelle colonneavg_sleep_hours_per_year
calculé à partir deavg_sleep_hours
super_sleepers$avg_sleep_hours_per_year <- super_sleepers$avg_sleep_hours * 365print(super_sleepers)
note pays animal1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda Chine note pays animal avg_sleep_hours1 1 koala Australie 212 2 hérisson Italie 183 3 paresseux Pérou 174 4 panda Chine 10 note pays animal avg_sleep_hours avg_sleep_hours_per_year1 1 koala Australie 21 76652 2 haie porc Italie 18 65703 3 paresseux Pérou 17 62054 4 panda Chine 10 3650
Aussi, il est possible de copier une colonne d'un DataFrame à un autre en utilisant la syntaxe suivante :df1$new_col <- df2$existing_col
. Reproduisons une telle situation :
# Création dusuper_dormeurs_1
dataframe avec la seule colonnenotation
super_sleepers_1 <- data.frame(rating=1:4)print(super_sleepers_1)cat('\n\n')# Copie duanimal
colonne desuper_sleepers_initial
poursuper_dormeurs_1
# Notez que dans le nouveau DataFrame, la colonne s'appelleANIMAL
au lieu deanimal
super_sleepers_1$ANIMAL <- super_sleepers_initial$animalprint(super_sleepers_1)
note1 12 23 34 4 note ANIMAL1 1 koala2 2 hérisson3 3 paresseux4 4 panda
L'inconvénient de cette approche (c'est-à-dire l'utilisation de l'opérateur \$ pour ajouter une colonne à un DataFrame) est que nous ne pouvons pas ajouter de cette manière une colonne dont le nom contient des espaces blancs ou des symboles spéciaux. En effet, il ne peut rien contenir qui ne soit une lettre (majuscule ou minuscule), un chiffre, un point ou un trait de soulignement. De plus, cette approche ne fonctionne pas pour l'ajout de plusieurs colonnes.
Ajout d'une colonne à un DataFrame dans R à l'aide de crochets
Une autre façon d'ajouter une nouvelle colonne à un R DataFrame est plus "de style DataFrame" que "de style liste": en utilisant la notation entre parenthèses. Voyons voir comment ça fonctionne:
# Reconstruire lesuper_dormeurs
DataFramesuper_sleepers <- super_sleepers_initialprint(super_sleepers)cat('\n\n')# Ajout d'une nouvelle colonneavg_sleep_hours
ausuper_dormeurs
DataFrame:super_sleepers['avg_sleep_hours'] <- c(21, 18, 17, 10)print(super_sleepers)
note pays animal1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda Chine note pays animal avg_sleep_hours1 1 koala Australie 212 2 hérisson Italie 183 3 paresseux Pérou 174 4 panda Chine 10
Dans le morceau de code ci-dessus, nous pouvons remplacer cette ligne :
super_sleepers['avg_sleep_hours'] <- c(21, 18, 17, 10)
Cette ligne peut également être remplacée :
super_sleepers[['avg_sleep_hours']] <- c(21, 18, 17, 10)
Enfin, celui-ci peut également être remplacé :
super_sleepers[,'avg_sleep_hours'] <- c(21, 18, 17, 10)
Le résultat sera identique, ce ne sont que 3 versions différentes de la syntaxe.
Comme pour la méthode précédente, nous pouvons attribuer une seule valeur au lieu d'un vecteur à la nouvelle colonne :
# Reconstruire lesuper_dormeurs
DataFramesuper_sleepers <- super_sleepers_initialprint(super_sleepers)cat('\n\n')# Ajout d'une nouvelle colonneavg_sleep_hours
ausuper_dormeurs
DataFrame et en l'attribuant à 'Unknown'super_sleepers['avg_sleep_hours'] <- 'Unknown'print(super_sleepers)
note pays animal1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda Chine note pays animal avg_sleep_hours1 1 koala Australie Inconnu2 2 hérisson Italie Inconnu3 3 paresseux Pérou Inconnu4 4 panda Chine Inconnu
Comme alternative, nous pouvons calculer une nouvelle colonne basée sur celles existantes :
# Reconstruire lesuper_dormeurs
DataFramesuper_sleepers <- super_sleepers_initialprint(super_sleepers)cat('\n\n')# Ajout d'une nouvelle colonneavg_sleep_hours
ausuper_dormeurs
DataFramesuper_sleepers['avg_sleep_hours'] <- c(21, 18, 17, 10)print(super_sleepers)cat('\n\n')# Ajout d'une nouvelle colonneavg_sleep_hours_per_year
calculé à partir deavg_sleep_hours
super_sleepers['avg_sleep_hours_per_year'] <- super_sleepers['avg_sleep_hours'] * 365print(super_sleepers)
note pays animal1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda Chine note pays animal avg_sleep_hours1 1 koala Australie 212 2 hérisson Italie 183 3 paresseux Pérou 174 4 panda Chine 10 note pays animal avg_sleep_hours avg_sleep_hours_per_year1 1 koala Australie 21 76652 2 haie porc Italie 18 65703 3 paresseux Pérou 17 62054 4 panda Chine 10 3650
En utilisant une autre option, nous pouvons copier une colonne d'un autre DataFrame :
# Création dusuper_dormeurs_1
dataframe avec la seule colonnenotation
super_sleepers_1 <- data.frame(rating=1:4)print(super_sleepers_1)cat('\n\n')# Copie duanimal
colonne desuper_sleepers_initial
poursuper_dormeurs_1
# Notez que dans le nouveau DataFrame, la colonne s'appelleANIMAL
au lieu deanimal
super_sleepers_1['ANIMAL'] <- super_sleepers_initial['animal']print(super_sleepers_1)
note1 12 23 34 4 note ANIMAL1 1 koala2 2 hérisson3 3 paresseux4 4 panda
L'avantage d'utiliser des crochets par rapport à l'opérateur $ pour ajouter une colonne à un DataFrame est que nous pouvons ajouter une colonne dont le nom contient des espaces blancs ou des symboles spéciaux.
Ajout d'une colonne à un DataFrame dans R à l'aide declier()
Fonction
La troisième façon d'ajouter une nouvelle colonne à un R DataFrame est d'appliquer leclier()
fonction qui signifie "column-bind" et peut également être utilisée pour combiner deux ou plusieurs DataFrames. L'utilisation de cette fonction est une approche plus universelle que les deux précédentes puisqu'elle permet d'ajouter plusieurs colonnes à la fois. Sa syntaxe de base est la suivante :
df <- cbind(df, new_col_1, new_col_2, ..., new_col_N)
Le morceau de code ci-dessous ajoute leavg_sleep_hours
colonne à lasuper_dormeurs
Trame de données:
# Reconstruire lesuper_dormeurs
DataFramesuper_sleepers <- super_sleepers_initialprint(super_sleepers)cat('\n\n')# Ajout d'une nouvelle colonneavg_sleep_hours
ausuper_dormeurs
DataFramesuper_sleepers <- cbind(super_sleepers, avg_sleep_hours=c(21, 18, 17, 10))print(super_sleepers)
note pays animal1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda Chine note pays animal avg_sleep_hours1 1 koala Australie 212 2 hérisson Italie 183 3 paresseux Pérou 174 4 panda Chine 10
Le morceau de code suivant ajoute deux nouvelles colonnes -avg_sleep_hours
eta_queue
- ausuper_dormeurs
DataFrame à la fois :
# Reconstruire lesuper_dormeurs
DataFramesuper_sleepers <- super_sleepers_initialprint(super_sleepers)cat('\n\n')# Ajout de deux nouvelles colonnesavg_sleep_hours
eta_queue
ausuper_dormeurs
DataFramesuper_sleepers <- cbind(super_sleepers, avg_sleep_hours=c(21, 18, 17, 10), has_tail=c('no', 'yes', 'yes', 'yes'))print(super_sleepers)
note pays animal1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda Chine note pays animal avg_sleep_hours has_tail1 1 koala Australie 21 no2 2 hérisson Italie 18 oui3 3 paresseux Pérou 17 oui4 4 panda Chine 10 oui
Outre l'ajout de plusieurs colonnes à la fois, un autre avantage de l'utilisation de laclier()
fonction est qu'elle permet d'affecter le résultat de cette opération (c'est-à-dire l'ajout d'une ou plusieurs colonnes à un DataFrame R) à un nouveau DataFrame en laissant le premier inchangé :
# Reconstruire lesuper_dormeurs
DataFramesuper_sleepers <- super_sleepers_initialprint(super_sleepers)cat('\n\n')# Création d'un nouveau DataFramesuper_sleepers_new
basé sursuper_dormeurs
avec une nouvelle colonneavg_sleep_hours
super_sleepers_new <- cbind(super_sleepers, avg_sleep_hours=c(21, 18, 17, 10), has_tail=c('no', 'yes', 'yes', 'yes'))print(super_sleepers_new)cat('\n \n')imprimer(super_sleepers)
note pays animal1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda Chine note pays animal avg_sleep_hours has_tail1 1 koala Australie 21 no2 2 hérisson Italie 18 oui3 3 paresseux Pérou 17 oui4 4 panda Chine 10 oui note pays animal1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda Chine
Comme pour les deux approches précédentes, à l'intérieur duclier()
fonction, nous pouvons attribuer une seule valeur à toute la nouvelle colonne :
# Reconstruire lesuper_dormeurs
DataFramesuper_sleepers <- super_sleepers_initialprint(super_sleepers)cat('\n\n')# Ajout d'une nouvelle colonneavg_sleep_hours
ausuper_dormeurs
DataFrame et en l'attribuant à 0.999super_sleepers <- cbind(super_sleepers, avg_sleep_hours=0.999)print(super_sleepers)
note pays animal1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda Chine note pays animal avg_sleep_hours1 1 koala Australie 0,9992 2 hérisson Italie 0,9993 3 paresseux Pérou 0,9994 4 panda Chine 0,999
Une autre option nous permet de le calculer en fonction des colonnes existantes :
# Reconstruire lesuper_dormeurs
DataFramesuper_sleepers <- super_sleepers_initialprint(super_sleepers)cat('\n\n')# Ajout d'une nouvelle colonneavg_sleep_hours
ausuper_dormeurs
DataFramesuper_sleepers <- cbind(super_sleepers, avg_sleep_hours=c(21, 18, 17, 10))print(super_sleepers)cat('\n\n')# Ajout d'une nouvelle colonneavg_sleep_hours_per_year
calculé à partir deavg_sleep_hours
super_sleepers <- cbind(super_sleepers, avg_sleep_hours_per_year=super_sleepers['avg_sleep_hours'] * 365)print(super_sleepers)
note pays animal1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda Chine note pays animal avg_sleep_hours1 1 koala Australie 212 2 hérisson Italie 183 3 paresseux Pérou 174 4 panda Chine 10 note pays animal avg_sleep_hours avg_sleep_hours1 1 koala Australie 21 76652 2 hérisson Italie 1 8 65703 3 paresseux Pérou 17 62054 4 panda Chine 10 3650
Avec l'option suivante, nous pouvons copier une colonne d'un autre DataFrame :
# Création dusuper_dormeurs_1
DataFrame avec la seule colonnenotation
super_sleepers_1 <- data.frame(rating=1:4)print(super_sleepers_1)cat('\n\n')# Copie duanimal
colonne desuper_sleepers_initial
poursuper_dormeurs_1
# Notez que dans le nouveau DataFrame, la colonne s'appelle toujoursanimal
malgré la définition du nouveau nomANIMAL
super_sleepers_1 <- cbind(super_sleepers_1, ANIMAL=super_sleepers_initial['animal'])print(super_sleepers_1)
note1 12 23 34 4 note animal1 1 koala2 2 hérisson3 3 paresseux4 4 panda
Cependant, contrairement aux approches de l'opérateur \$ et des crochets, faites attention aux deux nuances suivantes :
- Nous ne pouvons pas créer une nouvelle colonne et calculer une autre colonne en fonction de la nouvelleà l'intérieur du même
clier()
fonction. Par exemple, le morceau de code ci-dessous générera une erreur.
# Reconstruire lesuper_dormeurs
DataFramesuper_sleepers <- super_sleepers_initialprint(super_sleepers)cat('\n\n')# Tentative d'ajout d'une nouvelle colonneavg_sleep_hours
ausuper_dormeurs
DataFrame # ET une autre nouvelle colonneavg_sleep_hours_per_year
basé sur itsuper_sleepers <- cbind(super_sleepers, avg_sleep_hours=c(21, 18, 17, 10), avg_sleep_hours_per_year=super_sleepers['avg_sleep_hours'] * 365)print(super_sleepers)
note animal pays1 1 koala Australie2 2 hérisson Italie3 3 paresseux Pérou4 4 panda ChineErreur dans[.trame de données
(super_sleepers, "avg_sleep_hours") : colonnes non définies sélectionnéesTraceback :1. cbind(super_sleepers, avg_sleep_hours = c(21, 18, 17, 10), avg_sleep_hours_per_year = super_sleepers["avg_sleep_hours"] * . 365)2. super_sleepers["avg_sleep_hours"]3.[.trame de données
(super_sleepers, "avg_sleep_hours")4. stop("colonnes non définies sélectionnées")
- Lorsque nous copions une colonne d'un autre DataFrame et essayons de lui donner un nouveau nomà l'intérieur de
clier()
fonction, ce nouveau nom sera ignoré et la nouvelle colonne sera appelée exactement comme elle était appelée dans le DataFrame d'origine. Par exemple, dans le morceau de code ci-dessous, le nouveau nomANIMAL
a été ignorée et la nouvelle colonne a été appeléeanimal
, tout comme dans le DataFrame à partir duquel il a été copié :
# Création dusuper_dormeurs_1
DataFrame avec la seule colonnenotation
super_sleepers_1 <- data.frame(rating=1:4)print(super_sleepers_1)cat('\n\n')# Copie duanimal
colonne desuper_sleepers_initial
poursuper_dormeurs_1
# Notez que dans le nouveau DataFrame, la colonne s'appelle toujoursanimal
malgré la définition du nouveau nomANIMAL
super_sleepers_1 <- cbind(super_sleepers_1, ANIMAL=super_sleepers_initial['animal'])print(super_sleepers_1)
note1 12 23 34 4 note animal1 1 koala2 2 hérisson3 3 paresseux4 4 panda
Conclusion
Dans ce didacticiel, nous avons discuté des différentes raisons pour lesquelles nous pourrions avoir besoin d'ajouter une nouvelle colonne à un R DataFrame et du type d'informations qu'il peut stocker. Ensuite, nous avons exploré les trois manières différentes de le faire : en utilisant le symbole \$, les crochets et leclier()
fonction. Nous avons examiné la syntaxe de chacune de ces approches et ses variations possibles, les avantages et les inconvénients de chaque méthode, les fonctionnalités supplémentaires possibles, les pièges et erreurs les plus courants et comment les éviter. De plus, nous avons appris à ajouter plusieurs colonnes à une trame de données R à la fois.
Il convient de noter que les approches discutées ne sont pas les seuls moyens d'ajouter une colonne à un DataFrame dans R. Par exemple, dans le même but, nous pouvons utiliser lesubir une mutation()
ouadd_column()
les fonctions. Cependant, pour pouvoir appliquer ces fonctions, nous devons installer et charger des packages R spécifiques (dplyrettibble, en conséquence) sans qu'ils n'ajoutent de fonctionnalités supplémentaires à l'opération d'intérêt que celles dont nous avons discuté dans ce didacticiel. Au lieu de cela, en utilisant le symbole \$, les crochets et leclier()
la fonction ne nécessite aucune installation pour être implémentée dans la base R.
Tutoriels