ChallengeR #2

Je vais poster régulièrement des petits challenges de code sous R. Les résultats du premier sont ci-dessous, la question du second est en fin d’article.

Résultats du premier challenge

Votre mission consistait donc à reproduire la matrice suivante sous R avec le moins de code possible (étant précisé que les espaces, les indentations et les retours à la ligne ne sont pas considérés comme des caractères) :

> a
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    2    4    6    8   10
[3,]    3    6    9   12   15
[4,]    4    8   12   16   20
[5,]    5   10   15   20   25

Avant de vous donner les meilleures réponses, voici quelques unes des nombreuses façons de faire ça ; à commencer par la bonne vieille double boucle :

a <- matrix(NA, 5, 5)
for(i in 1:5) {
 for(j in 1:5) {
  a[i, j] <- i*j
 }
}

On pouvait aussi faire ça avec une seule boucle :

a <- matrix(1:5, 5, 5)
for(i in 1:5) a[, i] <- a[, i]*i

Ou :

a <- matrix(NA, 5, 5)
for(i in 1:5) a[, i] <- 1:5*i

Ou encore :

a <- matrix(1:5, 1, 5)
for(i in 2:5) a <- rbind(a, a[1, ]*i)

Mais sous R, dans la plupart des cas, on n'a pas besoin de boucle. Une alternative classique consiste à utiliser une des fonctions de la famille apply (apply, sapply, lapply, tapply ou rapply) :

sapply(1:5, function(i) i*1:5)

Ou, encore mieux et trouvée par @thedudeparis :

sapply(1:5, "*", 1:5)

On pouvait y arriver aussi avec une simple multiplication. Un certain @realDonaldTrump a proposé :

t(matrix(rep(1:5,5),5))*1:5

Ou, en utilisant l'argument byrow=TRUE dans matrix :

matrix(1:5, 5, 5, T) * 1:5

Ou encore, en transposant (avec t) :

a <- matrix(1:5, 5, 5)
a * t(a)

De là, certains d'entre vous ont pensé à un produit matriciel (avec l'opérateur %*%) ; c'est notamment le cas, encore, de @thedudeparis avec  :

1:5 %*% t(1:5)

Mais la meilleure solution consistait à utiliser la fonction outer ; @ClementinC à été le premier à chercher dans cette voie :

outer(1:5, 1:5, "*")

Ce qui, sachant que "*" est la valeur par défaut de l'argument FUN de outer, pouvait aussi s'écrire :

outer(1:5, 1:5)

Mais c'est @_AntoineB qui a pensé à utiliser l'opérateur de outer (%o%) et a donc remporté ce quiz avec à peine 9 caractères (bravo à lui !) :

1:5 %o% 1:5
Nouveau challenge

Soit le vecteur suivant :

x <- sample(0:9, 100, TRUE)

Comment compter le nombre de chiffres pairs avec le moins de code possible (les espaces, les indentations et les retours à la ligne ne sont pas comptés comme des caractères) ?

La meilleure réponse sera publiée ici même. Vous avez jusqu'au vendredi 19 janvier à 12h00 (heure de Paris).

Aucun commentaire:

Enregistrer un commentaire

Cheval de fer, acte II

La première partie est ici. Quand John Kennedy s’y était installé au tout début des années 1790, Manchester n’était encore qu’un gros bour...