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