Dataframe

Soit une liste :

a <- list(let = month.name[1:5], chi = rivers[1:5])

Comme tous les éléments de a sont des vecteurs de longueur identique, on peut écrire :

> b <- as.data.frame(a)
> b
       let chi
1  January 735
2 February 320
3    March 325
4    April 392
5      May 524

Et :

> class(b)
[1] "data.frame"

Un dataframe c’est une liste avec une structure de tableau à 2 dimensions :

> nrow(b)
[1] 5
> ncol(b)
[1] 2
> colnames(b)
[1] "let" "chi"

La différence entre une matrice est un dataframe, c’est que dans une matrice, toutes les données sont de même mode (i.e. numeric en général) tandis que dans un dataframe, chaque colonne à son propre mode. Dans le cas de b, let contient du texte et chi contient des données numériques.

Si vous avez déjà travaillé avec des bases de données, c’est exactement le même genre de structure qu’une table : les colonnes sont des champs qui peuvent avoir des natures différentes et les lignes des enregistrements.

On peut indexer un dataframe comme une matrice :

> b[, 2]
[1] 735 320 325 392 524
> b[, "chi"]
[1] 735 320 325 392 524

Ou comme une liste (seulement pour les colonnes) :

> b[[2]]
[1] 735 320 325 392 524
> b$chi
[1] 735 320 325 392 524
> b[["chi"]]
[1] 735 320 325 392 524

Pour isoler les lignes de b où b$let est égal à "March" ou "May", il suffit d’écrire :

> b[b$let %in% c("March", "May"), ]
    let chi
3 March 325
5   May 524

Ou vous pouvez utiliser la fonction subset :

> subset(b, let %in% c("March", "May"))
    let chi
3 March 325
5   May 524

(Vous auriez aussi pu écrire let == "March" | b$let == "May" mais admettez que %in% est plus pratique.)

Pour créer un dataframe, vous pouvez passer par la fonction data.frame :

b <- data.frame(let = month.name[1:5],
      chi = rivers[1:5])

Il existe une fonction fix qui vous permet d’afficher votre dataframe dans une nouvelle fenêtre (fonctionne aussi avec les matrices) :

> fix(b)

Attention : fix bloque toute exécution. Vous devez fermer la fenêtre avant de poursuivre et éviter de laisser traîner des fix dans vos scripts !

Vous pouvez même modifier des données à la main avec :

b <- edit(b)

Notez que lorsque vous récupérez une colonne de texte dans un dataframe, vous obtenez un objet de classe factor :

Par exemple :

rm(list = ls())
tmp <- expand.grid(Month = month.abb, Year = 2004:2014)
dta <- cbind(tmp, Data = rivers[1:132])

Nous avons :

> m <- dta$Month
> class(m)
[1] "factor"

Un facteur, c’est un moyen de manipuler les données plus rapidement comme les index d’une base de données. Le meilleur moyen de vous expliquer comment ces chose-là fonctionnent, c’est d’en construire un.

Soit month.abb, un vecteur de classe character :

> month.abb
  [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

Si nous voulions répéter cette séquence de mois sur onze années, nous pourrions écrire :

month.abb[rep(1:12, 11)]

Nous avons donc deux vecteurs : un vecteur de caractères qui contient un nombre fini de valeurs possibles (month.abb) et un vecteur numérique qui indique la position de chacune de ces valeurs dans un vecteur plus grand.

C’est le principe d’un facteur.

f <- factor(rep(1:12, 11), labels = month.abb)

En l’occurrence :

> all(f == m)
[1] TRUE

Vous pouvez récupérer la liste ordonnée des valeurs possibles avec levels, convertir votre facteur en vecteur numérique avec as.numeric ou récupérer le vecteur de texte originel avec as.character. De telle sorte que :

> all(levels(f)[as.numeric(f)] == as.character(f))
[1] TRUE

Maintenant que vous savez ce qu’est un dataframe, nous allons pouvoir commencer à importer des données dans R.

Aucun commentaire:

Enregistrer un commentaire