La syntaxe R peut sembler un peu bizarre, surtout si votre cadre de référence est à peu près n’importe quel autre langage de programmation. Voici quelques traits inhabituels de la langue que vous trouverez peut-être utiles de comprendre lorsque vous vous lancerez dans votre voyage pour apprendre R.
[This story is part of Computerworld‘s « Beginner’s guide to R. » To read from the beginning, check out the introduction; there are links on that page to the other pieces in the series.]
Attribuer des valeurs aux variables
Dans la plupart des autres langages de programmation que je connais, le signe égal attribue une certaine valeur à une variable. Vous savez, x = 3 signifie que x a maintenant la valeur de 3.
Mais dans R, l’opérateur d’affectation principal est <-
un péché:
x <- 3
Pas:
x = 3
Pour ajouter à la confusion potentielle, le signe égal en fait pouvez être utilisé comme opérateur d’affectation dans R – la plupart (mais pas tout) du temps.
La meilleure façon pour un débutant de gérer cela est d’utiliser l’opérateur d’affectation préféré guide de style tidyverse (tidyverse est un groupe de packages extrêmement populaires) – qui à son tour est utilisé par des organisations comme Google pour son guide de style R – et ce que vous verrez dans la plupart des codes R.
(Si ce n’est pas une assez bonne explication pour vous et vous voulez vraiment vraiment connaître les tenants et les aboutissants des options d’affectation de 5 – oui, comptez-les, 5 – de R, consultez le Page des opérateurs d’affectation du manuel R.)
Vous verrez cependant le signe égal à quelques endroits. L’une consiste à attribuer des valeurs par défaut à un argument lors de la création d’une fonction, telle que
myfunction <- function(myarg1 = 10) {
# some R code here using myarg1
}
Un autre est dans certaines fonctions, telles que le fonction mutate() du package dplyr (crée ou modifie des colonnes dans un bloc de données).
Une note de plus sur les variables : R est un langage sensible à la casse. Ainsi, la variable x n’est pas la même que X. Cela s’applique à peu près à tout dans R ; par exemple, la fonction subset()
ne serait pas le même que Subset()
.
c est pour combiner (ou concaténer, et parfois convertir/contraindre.)
Lorsque vous créez un tableau dans la plupart des langages de programmation, la syntaxe ressemble à ceci :
myArray = array(1, 1, 2, 3, 5, 8);
Ou:
int myArray = {1, 1, 2, 3, 5, 8};
Ou peut-être:
myArray = [1, 1, 2, 3, 5, 8]
Dans R, cependant, il y a un élément supplémentaire : pour mettre plusieurs valeurs dans une seule variable, vous utilisez la c()
fonction, comme :
my_vector <- c(1, 1, 2, 3, 5, 8)
Si tu oublies ça c()
, vous obtiendrez une erreur. Lorsque vous débutez dans R, vous verrez probablement des erreurs liées à l’omission de c() a parcelle. (Du moins, je l’ai fait.) Cela finit par devenir quelque chose auquel vous ne pensez pas beaucoup, cependant.
Et maintenant que j’ai souligné l’importance de cela c()
fonction, je vous dirai (à contrecœur) qu’il y a un cas où vous pouvez l’omettre – si vous faites référence à des valeurs consécutives dans une plage avec deux-points entre le minimum et le maximum, comme ceci :
my_vector <- (1:10)
Vous rencontrerez probablement ce style dans les didacticiels et les textes R, et il peut être déroutant de voir le c()
requis pour quelques plusieurs valeurs mais pas les autres. Notez que ce ne sera pas blesser n’importe quoi pour utiliser le c()
avec une plage séparée par deux-points, même si ce n’est pas obligatoire, par exemple :
my_vector <- c(1:10)
Un autre point important concernant la c()
fonction : elle suppose que tout dans votre vecteur est du même type de données, c’est-à-dire tous les nombres ou tous les caractères. Si vous créez un vecteur tel que :
my_vector <- c(1, 4, "hello", TRUE)
Vous serez ne pas avoir un vecteur avec deux objets entiers, un objet caractère et un objet logique. Au lieu, c()
fera ce qu’il peut pour les convertir tous dans le même type d’objet, dans ce cas tous les objets de caractère. Donc my_vector contiendra « 1 », « 4 », « hello » et « TRUE ». Vous pouvez aussi penser à c()
comme pour « convertir » ou « contraindre ».
Pour créer une collection avec plusieurs types d’objets, vous avez besoin d’un R liste, pas un vecteur. Vous créez une liste avec le list()
fonction, non c(),
tel que:
My_list <- list(1,4,"hello", TRUE)
Maintenant, vous avez une variable qui contient le numéro 1, le numéro 4, l’objet caractère « hello » et l’objet logique TRUE.
Les index vectoriels dans R commencent à 1 et non à 0
Dans la plupart des langages informatiques, le premier élément d’un vecteur, d’une liste ou d’un tableau est l’élément 0. Dans R, il s’agit de l’élément 1. my_vector[1] est le premier élément de my_vector. Si vous venez d’une autre langue, ce sera étrange au début. Mais une fois que vous vous y serez habitué, vous réaliserez probablement à quel point il est incroyablement pratique et intuitif, et vous vous demanderez pourquoi plus de langues n’utilisent pas ce système plus convivial. Après tout, gens compter les choses à partir de 1, pas de 0 !
Boucles sans boucle
L’itération à travers une collection de données avec des boucles comme « for » et « while » est la pierre angulaire de nombreux langages de programmation. Ce n’est pas la façon R, cependant. Alors que R a Boucles for, while et repeatvous verrez plus probablement des opérations appliquées à une collection de données à l’aide appliquer() fonctions ou les ronronner paquet tidyverse.
Mais d’abord, quelques bases.
Si vous avez un vecteur de nombres tel que :
my_vector <- c(7,9,23,5)
et, par exemple, vous voulez multiplier chacun par 0,01 pour les transformer en pourcentages, comment feriez-vous cela ? Vous n’avez pas du tout besoin d’une boucle for, foreach ou while. Au lieu de cela, vous pouvez créer un nouveau vecteur appelé my_pct_vectors comme ceci :
my_pct_vector <- my_vector * 0.01
L’exécution d’une opération mathématique sur une variable vectorielle bouclera automatiquement sur chaque élément du vecteur. De nombreuses fonctions R sont déjà vectorisées, mais d’autres ne le sont pas, et il est important de connaître la différence. if()
n’est pas vectorisé, par exemple, mais il existe une version ifelse()
C’est.
Si vous essayez d’utiliser une fonction non vectorisée sur un vecteur, vous verrez un message d’erreur tel que
the condition has length > 1 and only the first element will be used
Cependant, en analyse de données, vous souhaitez généralement appliquer des fonctions à plusieurs éléments de vos données : trouver le salaire moyen par intitulé de poste, par exemple, ou l’écart type des valeurs de propriété par communauté. le apply()
groupe de fonctions et dans la base R et fonctions dans le paquet de ronronnement tidyverse sont conçus pour cela. J’ai appris R en utilisant l’ancien paquet de plis pour cela – et bien que j’aime beaucoup ce package, il a essentiellement été retiré.
Il existe plus d’une demi-douzaine de fonctions dans la famille apply, selon le type d’objet de données sur lequel on agit et le type d’objet de données renvoyé. « Ces fonctions peuvent parfois être extrêmement difficiles à faire fonctionner exactement comme vous le souhaitez, en particulier pour les nouveaux venus dans R », déclare un article de blog sur Revolution Analyticsqui se concentre sur la classe entreprise R, en vantant les plis sur la base R.
Vieux ordinaire apply()
exécute une fonction sur chaque ligne ou chaque colonne d’une matrice bidimensionnelle ou d’un bloc de données où toutes les colonnes sont du même type de données. Vous spécifiez si vous appliquez par lignes ou par colonnes en ajoutant l’argument 1 pour appliquer par ligne ou 2 pour appliquer par colonne. Par example:
apply(my_matrix, 1, median)
renvoie la médiane de chaque ligne dans my_matrix et
apply(my_matrix, 2, median)
calcule la médiane de chaque colonne.
D’autres fonctions de la famille apply() telles que lapply() ou tapply() traitent différents types de données d’entrée/sortie. Le bioinformaticien statistique australien Neal FW Saunders a une belle brève introduction à appliquer dans R dans un article de blog si vous souhaitez en savoir plus et voir quelques exemples.
purrr est un peu au-delà de la portée d’un guide de base pour débutant. Mais si vous souhaitez en savoir plus, rendez-vous sur ronronner site web et/ou Jenny Bryan’s site de tutoriel de ronronnement.
Types de données R en bref (très bref)
Faut-il se renseigner sur tout des types de données de R et comment ils se comportent dès le départ, en tant que débutant ? Si votre objectif est d’être un expert R, alors oui, vous devez connaître les tenants et les aboutissants des types de données. Mais mon hypothèse est que vous êtes ici pour essayer de générer des graphiques et des statistiques rapides avant de plonger dans la création de code complexe.
Voici donc ce que je vous suggère de garder à l’esprit pour l’instant : R a plusieurs types de données. Certains d’entre eux sont particulièrement importants lorsque vous effectuez un travail de base sur les données. Et la plupart des fonctions nécessitent que vos données soient dans un type et une structure particuliers.
Plus précisément, les types de données R incluent les entiers, les numériques, les caractères et les logiques. Les valeurs manquantes sont représentées par NaN (si une fonction mathématique ne fonctionne pas correctement) ou NA (manquant ou indisponible).
Comme mentionné dans la section précédente, vous pouvez avoir un vecteur avec plusieurs éléments du même type, tels que :
1, 5, 7
ou
"Bill", "Bob", "Sue"
UNE Célibataire nombre ou chaîne de caractères est aussi un vecteur – un vecteur de longueur 1. Lorsque vous accédez à la valeur d’une variable qui n’a qu’une seule valeur, telle que 73 ou « En savoir plus sur R sur Computerworld.com », vous le verrez également dans votre console avant le valeur:
[1]
Cela vous indique que votre impression d’écran commence à l’élément vectoriel numéro un. Si vous avez un vecteur avec beaucoup de valeurs pour que l’impression s’étende sur plusieurs lignes, chaque ligne commencera par un nombre entre parenthèses, vous indiquant par quel numéro d’élément vectoriel cette ligne particulière commence. (Voir la capture d’écran ci-dessous.)
Comme mentionné précédemment, si vous souhaitez mélanger des nombres et des chaînes ou des nombres et des types TRUE/FALSE, vous avez besoin d’une liste. (Si vous ne créez pas de liste, vous pourriez être désagréablement surpris que votre variable contenant (3, 8, « petit ») ait été transformée en un vecteur de caractères (« 3 », « 8 », « petit »).)
Et en passant, R suppose que 3 est de la même classe que 3.0 — numérique (c’est-à-dire avec un point décimal). Si vous voulez le entier 3, vous devez le signifier comme 3L ou avec la fonction as.integer(). Dans une situation où cela vous importe, vous pouvez vérifier le type de numéro que vous avez en utilisant le class()
une fonction:
class(3)
class(3.0)
class(3L)
class(as.integer(3))
Il y a plusieurs as()
fonctions de conversion d’un type de données en un autre, y compris as.character()
, as.list()
et as.data.frame()
.
R a également des types de types de données spéciaux qui présentent un intérêt particulier lors de l’analyse des données, tels que les matrices et les trames de données. Une matrice a des lignes et des colonnes ; vous pouvez trouver une dimension matricielle avec dim() telle que
dim(my_matrix)
Une matrice doit avoir le même type de données dans chaque colonne, comme des nombres partout.
Les trames de données sont beaucoup plus couramment utilisées. Ils sont similaires aux matrices, sauf qu’une colonne peut avoir un type de données différent d’une autre colonne, et chaque colonne doit avoir un nom. Si vous avez des données dans un format qui pourrait bien fonctionner comme une table de base de données (ou une table de feuille de calcul bien formée), cela fonctionnera probablement aussi bien comme une trame de données R.
Contrairement à Python, où ce type de données bidimensionnel nécessite un package complémentaire (pandas), les trames de données sont intégrées à R. Il existe des packages qui étendre les capacités de base des trames de données R, cependant. Un, le paquet tibble tidyverse, crée des blocs de données de base avec quelques fonctionnalités supplémentaires. Un autre, data.table, est conçu pour une vitesse fulgurante lors de la gestion de grands ensembles de données. Il ajoute beaucoup de fonctionnalités entre parenthèses de l’objet de table de données
mydt[code to filter columns, code to create new columns, code to group data]
Beaucoup de data.table vous sembleront familiers si vous connaissez SQL. Pour en savoir plus sur data.table, consultez le site web du forfait ou cette vidéo d’introduction :
Lorsque vous travaillez avec un bloc de données de base, vous pouvez considérer chaque ligne comme similaire à un enregistrement de base de données et chaque colonne comme un champ de base de données. Il existe de nombreuses fonctions utiles que vous pouvez appliquer aux blocs de données, telles que les R de base summary()
et l’aperçu() du package dplyr.
Retour aux bizarreries de base de R : il existe plusieurs façons de trouver le type de données sous-jacent d’un objet, mais toutes ne renvoient pas la même valeur. Par example, class()
et str()
reviendra trame de données sur un objet de bloc de données, mais mode()
renvoie le plus générique liste.
Si vous souhaitez en savoir plus sur les types de données dans R, vous pouvez regarder cette conférence vidéo de Roger Peng, professeur agrégé de biostatistique à la Johns Hopkins Bloomberg School of Public Health :
Un autre concept utile pour conclure cette section — accrochez-vous, nous avons presque terminé : les facteurs. Ceux-ci représentent catégories dans vos données. Donc, si vous avez une base de données avec des employés, leur service et leurs salaires, les salaires seraient des données numériques et les employés seraient des caractères (chaînes dans de nombreuses autres langues) ; mais vous voudrez peut-être que le ministère soit un facteur — une catégorie par laquelle vous souhaiterez peut-être regrouper ou modéliser vos données. Les facteurs peuvent être non ordonnés, tels que le département, ou ordonnés, tels que « médiocre », « correct », « bon » et « excellent ».
La ligne de commande R diffère du shell Unix
Lorsque vous commencez à travailler dans l’environnement R, il ressemble assez à un shell Unix. En fait, certaines actions de ligne de commande R se comportent comme vous vous en doutez si vous venez d’un environnement Unix, mais d’autres non.
Vous voulez parcourir vos dernières commandes ? La flèche vers le haut fonctionne dans R comme dans Unix – continuez à appuyer dessus pour voir les commandes précédentes.
La fonction liste, ls()
, vous donnera une liste, mais pas de fichiers comme sous Unix. Au lieu de cela, il fournira une liste d’objets dans votre session R actuelle.
Vous voulez voir votre répertoire de travail actuel ? pwd, que vous utiliseriez sous Unix, génère simplement une erreur ; ce que tu veux c’est getwd()
.
rm(my_variable)
supprimera une variable de votre session en cours.