Numeric

Je vais traiter les vecteurs numeric (comme value) et les vecteurs integer (comme years) en même temps puisque, pour l’essentiel, ils fonctionnent de la même manière.

Commençons par un peu de ménage :

rm(list = ls())
value <- head(rivers, 15)
years <- seq(2000, by = 1, len = 15)

De telle sorte que :

> value
 [1]  735  320  325  392  524  450 1459  135  465  600  330  336  280  315
[15]  870
> years
 [1] 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013
[15] 2014

Assez naturellement, dès lors que les vecteurs numériques contiennent des nombres, ils nous donnent envie de calculer.

Pour la somme des éléments de value :

> sum(value)
[1] 7536

Pour l’écart-type :

> sd(value)
[1] 324.2966

Si vous souhaitez calculer la différence entre chaque élément successif de years :

> diff(years)
 [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Pour inverser l’ordre de years :

> rev(years)
 [1] 2014 2013 2012 2011 2010 2009 2008 2007 2006 2005 2004 2003 2002 2001
[15] 2000

Il existe une quantité invraisemblable de fonctions que vous pouvez utiliser pour manipuler ses deux vecteurs. Je vous encourage à fouiller dans l’aide en utilisant la fonction help.search.

Par exemple, pour les logarithmes :

> help.search("logarythm")

Ou :

> ??"logarythm"

Ce qui vous apprend qu’il existe une fonction log dans le package base (c’est ce que signifie base::log) ; laquelle vous permettra de faire des choses comme ça :

> diff(log(value))
 [1] -0.83154950  0.01550419  0.18743666  0.29022984 -0.15224410  1.17625897
 [7] -2.38023177  1.23676263  0.25489225 -0.59783700  0.01801851 -0.18232156
[13]  0.11778304  1.01592057

Cette parenthèse sur les vecteurs numériques est l’occasion de revenir sur cette notion de recyclage que nous avons déjà évoqué.

Si vous exécutez :

> years + value
 [1] 2735 2321 2327 2395 2528 2455 3465 2142 2473 2609 2340 2347 2292 2328
[15] 2884

R calcule la somme des éléments de years et de value membre à membre. Ça fonctionne très bien parce que years et value sont de mêmes longueurs.

Maintenant, essayez ça :

> years + 1
 [1] 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014
[15] 2015

Nous avons sommé deux vecteurs numériques (years et 1) qui ne sont pas de la même longueur puisque le premier comporte 15 éléments et le second un seul. R a recyclé le vecteur le plus court ; c’est-à-dire qu’il a calculé :

years[1]+1, years[2]+1, (…), years[length(years)]+1

De la même manière, vous pouvez aussi :

> rep(1, 10) + 1:5
 [1] 2 3 4 5 6 2 3 4 5 6

Ça ne pose aucun problème puisque la longueur de 1:5 est un multiple de la longueur de rep(1, 10). Là encore, R a recyclé le vecteur le plus court (deux fois) ; c’est-à-dire qu’il a calculé l’équivalent de :

rep(1, 10) + rep(1:5, 2)

Lorsque la longueur du vecteur le plus court n’est pas un multiple de la longueur du vecteur le plus long, R calcule quand même mais vous avertit :

> years + 1:4
 [1] 2001 2003 2005 2007 2005 2007 2009 2011 2009 2011 2013 2015 2013 2015
[15] 2017
Message d'avis :
In years + 1:4 :
  la taille d'un objet plus long n'est pas multiple de la taille d'un objet
  plus court

Évidemment, ça fonctionne avec tous les opérateurs arithmétiques. Par exemple, pour élever les éléments de value au carré :

> value^2
 [1]  540225  102400  105625  153664  274576  202500 2128681   18225  216225
[10]  360000  108900  112896   78400   99225  756900

Vous pouvez aussi écrire ça :

> value^(1:3)
 [1]       735    102400  34328125       392    274576  91125000      1459
 [8]     18225 100544625       600    108900  37933056       280     99225
[15] 658503000

Ce qui a pour effet d’élever les éléments 1, 4, 7, 10 et 13 à la puissance 1, les éléments 2, 5, 8, 11 et 14 au carré et les autres au cube.

Aucun commentaire:

Enregistrer un commentaire