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).

8 commentaires:

  1. But a smiling visitant here to share the love. btw great style and design.

    RépondreSupprimer
  2. This article offered by you is very useful for proper planning.

    RépondreSupprimer
  3. Thank you for sharing excellent informations.

    RépondreSupprimer
  4. Thank you for this fascinating post, Keep blogging. Keep writing

    RépondreSupprimer
  5. I am happy I observed this website on Google. The site is fantastic and has a lot a good points

    RépondreSupprimer
  6. This is a wonderful blog that I want to read it twice! Thanks ! Keep it up.

    RépondreSupprimer
  7. I feel very grateful that I read this article. Still waiting for some, Thanks

    RépondreSupprimer

Votre mot de passe

On ne va pas épiloguer pendant 150 ans, vous avez besoin : De mots de passe très forts (à partir de 128 bits), un par site (sauf, éventuel...