C'est de la data et mon expeRtise afin d'en tirer le maximum

Comment obtenir l’indice d’une ligne ?

obtenir l'indice de ligne
Image par mohamed Hassan de Pixabay

Lorsqu’on analyse des données, on a fréquemment besoin de déterminer les indices des lignes répondant à une certaine condition. On peut, par exemple, avoir besoin de connaître sur quelle ligne se trouve la valeur minimale d’une variable.

Nous allons voir qu’il existe quelques fonctions, facile d’utilisation, pour répondre à ce besoin. Nous allons ici employer les fonctions which.min()which.max()which(), et grep() qui appartiennent au package base, et str_detect() qui appartient au package stringr, qui lui-même appartient au super package tidyverse.

Identifier l'indice d'une valeur minimale

Pour illustrer cette question, nous allons considérer les données iris qui sont disponibles dans le package dataset (chargé par défaut), en voici un extrait :

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa 

Pour identifier, par exemple, le numéro de la ligne sur laquelle se situe la valeur minimale de longueur des sépales (variable Sepal.Length), nous allons employer la fonction which.min(), comme ceci :

which.min(iris$Sepal.Length)
[1] 14 

La fonction nous renvoie l’indice 14. Nous pouvons vérifier : 

which.min(iris$Sepal.Length)
[1] 14
# recherche de la valeur minimale
min(iris$Sepal.Length)
[1] 4.3
 #affichage de la 14ème ligne 
iris$Sepal.Length[14]
[1] 4.3
#affichage de la 14ème ligne 
iris$Sepal.Length[14]
[1] 4.3 

Identifier l'indice d'une valeur maximale

Pour identifier le numéro de la ligne sur laquelle se situe la valeur maximale d’une variable, nous allons employer la fonction which.max(), comme ceci :

which.max(iris$Sepal.Length)
[1] 132 

La fonction nous renvoie l’indice 132. Nous pouvons vérifier :

# recherche de la valeur maximale
max(iris$Sepal.Length)
[1] 7.9
#affichage de la 132 ème ligne 
iris$Sepal.Length[132]
[1] 7.9 

La valeur de la 132ème ligne correspond bien à la valeur maximale.

Identifier l'indice de plusieurs valeurs numériques

Parfois, ce dont nous avons besoin, c’est de pouvoir localiser les lignes sur lesquelles se situent un ensemble de valeurs.

Par exemple, si je souhaite connaître toutes les lignes correspondant à des valeurs de la variable Sepal.Length égales à 4.3, 5.1 ou 5.8 , je vais employer la fonction which() en combinaison avec l’opérateur %in%, comme ceci :

which(iris$Sepal.Length %in% c(4.3,5.1,5.8))
 [1]   1  14  15  18  20  22  24  40  45  47  68  83  93  99 102 115 143 

Pour vérifier, nous pouvons employer le code suivant :

# stockage dans l'objet ind les indices des lignes
ind <- which(iris$Sepal.Length %in% c(4.3,5.1,5.8))
# affichage les valeurs de la variable Sepal.Length des lignes stockées dans ind
iris$Sepal.Length[ind]
 [1] 5.1 4.3 5.8 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.8 5.8 5.8 5.1 5.8 5.8 5.8 

Un exemple concret de l’utilisation de cette fonction est la recherche des valeurs outliers. Par exemple, si nous réalisons un boxplot de la variable Sepal.Width, nous pouvons visualiser la présence de 4 outliers (points rouges).

library(ggplot2)
ggplot(iris, aes(y=Sepal.Width,x=1))+
	geom_boxplot(outlier.colour = "red") 
obtenir l'indice des outliers

Pour connaître les valeurs de ces outliers :

outliers.val <- boxplot.stats(iris$Sepal.Width)$out
outliers.val
[1] 4.4 4.1 4.2 2.0 

Et pour connaître sur quelle lignes elles sont présentes, pour pouvoir éventuellement les supprimer (je n’ai pas dit qu’il fallait le faire):

outliers.ind <- which(iris$Sepal.Width %in% outliers.val)
outliers.ind
[1] 16 33 34 61

#verif
iris$Sepal.Width[outliers.ind]
[1] 4.4 4.1 4.2 2.0 

Identifier les indices d'un niveau d'un facteur

Dans le jeu de données iris, la variable Species est un facteur:

class(iris$Species)
[1] "factor" 

Si je veux obtenir les indices des lignes correspondant à l’espèce versicolor, je peux utiliser la fonction which(), avec  l’opérateur ==, comme ceci : 

which(iris$Species=="versicolor")
 [1]  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68
[19]  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86
[37]  87  88  89  90  91  92  93  94  95  96  97  98  99 100 

Et pour avoir les indices de plusieurs niveaux (ici versicolor ou virginica), on utilise encore l’opérateur %in%, comme ceci :

which(iris$Species %in% c("versicolor", "virginica"))
  [1]  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67
 [18]  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84
 [35]  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 101
 [52] 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
 [69] 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
 [86] 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 

Identifier l'indice d'un motif dans une chaîne de caractères

Pour cette partie, nous allons commencer par créer une variable Species_str en transformant la variable Species qui est un facteur, en une chaîne de caractères. Cela nous permettra d’avoir accès aux lettres (cela n’est pas le cas, quand il s’agit d’un facteur):

# passage en chaîne de caractères
iris$Species_str <- as.character(iris$Species)
# vérification
class(iris$Species_str)
[1] "character" 

Par exemple, si nous souhaitons obtenir les indices des lignes dont la variable Species_str contient le motif (ou pattern) “eto", nous pouvons employer la fonction grep(), comme ceci :

grep("eto", iris$Species_str)
 

Cela correspond bien aux lignes relatives à l’espèce Setosa (qui contient le motif  “eto”).

Pour rechercher plusieurs motifs, il est nécessaire d’utiliser l’opérateur  |, avec la syntaxe pattern1|pattern2, comme ceci :

grep("eto|versi", iris$Species_str) 

Il est également possible d’employer la fonction str_detect() du package stringr, en combinaison avec la fonction which(), comme ceci :

 library(stringr)
ind <- which(str_detect(iris$Species_str, "eto"))
ind
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
[25] 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
[49] 49 50 

J’espère que ce court article permettra aux lecteurs de ce blog, qui débutent avec R, de pouvoir faire plus facilement extraire les indices qui les intéressent.
Si cet article vous a plu ou vous a été utile, n’oubliez pas de le partager ! Vous pouvez également soutenir le blog par un don libre sur la page Tipeee.

Poursuivez votre lecture

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.