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).
But a smiling visitant here to share the love. btw great style and design.
RépondreSupprimerWell I truly enjoyed studying it.
RépondreSupprimerThis article offered by you is very useful for proper planning.
RépondreSupprimerThank you for sharing excellent informations.
RépondreSupprimerThank you for this fascinating post, Keep blogging. Keep writing
RépondreSupprimerI am happy I observed this website on Google. The site is fantastic and has a lot a good points
RépondreSupprimerThis is a wonderful blog that I want to read it twice! Thanks ! Keep it up.
RépondreSupprimerI feel very grateful that I read this article. Still waiting for some, Thanks
RépondreSupprimer