1. Grâce à ce formulaire vous pouvez proposer une astuce ou un script sur R.
  2. Votre script doit pouvoir être lancé en l'état. Veuillez penser à :
    • inclure le chargement des "library" nécessaires
    • construire un petit jeu de données si besoin est.
    • commenter les lignes de codes pour en faciliter la compréhension.
  3. Le titre de votre script ou astuce doit être clair et explicite.
  4. Pensez à mettre votre code entre les balises [R] et [/R]; Pour cela, vous pouvez utiliser le bouton

Vous pouvez utiliser vos comptes Facebook, twitter ou google pour vous identifer (google est compatible yahoo, openID...)
L'ideal étant de vous connecter si vous avez un compte utilisateur, ou faire une demande de compte utilisateur si vous n'en avez pas encore.
Créer un compte va vous permettre de pouvoir éditer vos codes et de mettre en avant votre site internet.
Sinon vous pouvez soumettre anonymement en remplissant les champs ci-après.







Choisissez les catégories correspondantes à votre Code:

  • algorithmique
  • Analyse de survie
  • base indispensable
  • bayésien
  • configuration de R
  • exportation de données
  • fonctions utiles
  • graphique
  • importation de données
  • inférence
  • manipulation de données
  • message d'erreur
  • modélisation
  • Non classé
  • optimisation
  • planification
  • programmer avec R
  • regression linéaire
  • Test
  • tidyverse
  • Transformation de données


algorithmique

Comment fixer et reproduire l’aléatoire ? set.seed()

0
dans algorithmique
- ça ne sert à rien -- c\'est interessant - (score de +2 sur 2 votes)
Loading ... Loading ...
Afin d’utiliser des processus aléatoires mais de faire en sorte qu’ils soient reproductibles dans le temps ou sur une autre machine/système
set.seed()
est une fonction qui permet de fixer les résultats qui seront fournis par le RNG (random number generator).

 
sample(letters[4:9]) 
[1] "d" "g" "f" "h" "i" "e" 
sample(letters[4:9]) 
[1] "e" "i" "g" "f" "h" "d" 
sample(letters[4:9]) 
[1] "f" "d" "e" "h" "i" "g"
 
set.seed(123)
sample(letters[4:9]) 
[1] "e" "g" "i" "f" "h" "d" 
set.seed(123) 
sample(letters[4:9]) 
[1] "e" "g" "i" "f" "h" "d"
 
 


Comment choisir le chiffre à mettre dans la fonction set.seed ? Au hasard ! ;-)


Proposé par Diane.

Pas encore de commentaire, cliquez ici pour réagir.

Sélectionner des sous-ensembles de jeux de données avec la fonction subset

2
dans algorithmique, manipulation de données, programmer avec R, Transformation de données
- ça ne sert à rien -- c\'est interessant - (score de +3 sur 3 votes)
Loading ... Loading ...
Si l’on veut sélectionner un sous-ensemble d’un jeu de données à partir d’une condition simple étendue, d’une condition multiple exclusive, d’une condition multiple inclusive, d’une condition multiple exclusive étendue, ou d’une condition multiple inclusive étendue, il faut utiliser les opérateurs logiques OU et/ou ET.
Dans R, le ET s’écrit « & », et le OU s’écrit « | ».

Une condition simple porte sur une seule colonne.
Une condition multiple porte sur plusieurs colonnes à la fois (comme pour les régressions).
Une condition étendue porte sur l’union de plusieurs modalités/critères au sein d’une même colonne : elle utilise l’opérateur logique OU.
Une condition exclusive est une condition multiple qui porte sur l’intersection de sous-ensembles : elle utiilise l’opérateur logique ET.
Une condition inclusive est une condition multiple qui porte sur l’union de sous-ensembles : elle utilise l’opérateur logique OU.
Une condition simple ne peut, par nature, ni être exclusive, ni être inclusive.

Pour une sélection simple étendue, on utilisera l’opérateur logique OU.
Pour une sélection multiple exclusive, on utilisera l’opérateur logique ET.
Pour une sélection multiple inclusive, on utilisera l’opérateur logique OU.
Pour une sélection multiple exclusive étendue, on utilisera les opérateurs logiques OU et ET.
Pour une sélection multiple inclusive étendue, on utilisera l’opérateur logique OU.


 
 
data(iris)
head(Iris)
summary(iris)
 
### Exemple de sélection simple étendue sur une variable qualitative ###
# Il existe dans ce jeu de données 3 espèces : setosa, versicolor et virginica.
# On veut sélectionner le sous-ensemble concernant les espèces setosa OU versicolor.
iris2 = subset(iris, Species == "setosa" | Species == "versicolor") # on peut soit passer par la fonction 'subset'
iris2 = iris[iris$Species == "setosa" | iris$Species == "versicolor",] # ou soit passer par les conditions entre crochets
iris2
 
# En revanche, on ne peut pas utiliser cette syntaxe :
iris2 = subset(iris, Species == c("setosa","versicolor"))
# Ni celle-ci :
iris2 = iris[iris$Species == c("setosa","versicolor")]
# Car je ne sais pas pourquoi, mais ces syntaxes ne sélectionnent qu'une partie du sous-ensemble désiré. Cette partie a un nombre de lignes égal au nombre de lignes qui auraient été sélectionnées par une condition portant sur une seule modalité.
dim(iris2) # On a 50 lignes, alors qu'on devrait en avoir 100 !
 
 
### Exemple de sélection simple étendue sur une variable quantitative ###
# On veut sélectionner les fleurs dont la longueur du pétale est inférieure à 1,5 cm OU supérieure à 5 cm.
iris3 = subset(iris, Petal.Length <= 1.5 | Petal.Length >= 5)
iris3 = iris[iris$Petal.Length <= 1.5 | iris$Petal.Length >= 5,]
iris3
 
 
### Exemple de sélection multiple exclusive ###
# On veut sélectionner les fleurs de l'espèce setosa ET dont la longueur du pétale est inférieure à 1,5 cm.
iris4 = subset(iris, Species == "setosa" & Petal.Length <= 1.5)
iris4 = iris[iris$Species == "setosa" & iris$Petal.Length <= 1.5,]
iris4
 
 
### Exemple de sélection multiple inclusive ###
# On veut sélectionner les fleurs de l'espèce setosa OU celles dont la longueur du pétale est supérieure à 5 cm.
iris5 = subset(iris, Species == "setosa" | Petal.Length >= 5)
iris5 = iris[iris$Species == "setosa" | iris$Petal.Length >= 5,]
iris5
 
 
### Exemple de sélection multiple exclusive étendue ###
# On veut sélectionner les fleurs de l'espèce versicolor OU virginica ET dont la longueur du pétale est supérieure à 5 cm.
# Attentions, il faut alors utiliser des parenthèses !
iris6 = subset(iris, (Species == "versicolor" | Species == "virginica") & Petal.Length >= 5)
iris6 = iris[(iris$Species == "versicolor" | iris$Species == "virginica") & iris$Petal.Length >= 5,]
iris6
 
 
### Exemple de sélection multiple inclusive étendue ###
# On veut sélectionner les fleurs de l'espèce versicolor OU virginica OU celles dont la longueur du pétale est inférieure à 1,5 cm.
# Pas forcément besoin de parenthèses ici.
iris7 = subset(iris, Species == "versicolor" | Species == "virginica" | Petal.Length <= 1.5)
iris7 = iris[iris$Species == "versicolor" | iris$Species == "virginica" | iris$Petal.Length <= 1.5,]
iris7
 


Proposé par Stan.

Déjà 2 commentaires. Cliquez ici pour réagir.

Comment utiliser la parallélisation des calculs avec R ?: foreach

2
dans algorithmique, fonctions utiles, programmer avec R
- ça ne sert à rien -- c\'est interessant - (score de +5 sur 5 votes)
Loading ... Loading ...
la parallélisation des calculs, permet d’exploiter au maximum les capacité calculatoire de votre ordinateur en utilisant tous les core de votre machine ( dual core , quad core …)
Cette facpon de proceder est rentable si le calcul que vous voulez faire prend plus de temps que le fait de mettre en place la parallélisation

 
library(foreach)
library(doSNOW)
getDoParWorkers()
registerDoSNOW(makeCluster(4, type = "SOCK"))# 2 , 4 ou plus en fonction de votre machine
getDoParWorkers()
N <- 10^4
system.time(foreach(i = 1:N,.combine = "cbind") %do% {sum(rnorm(N))})
system.time(foreach(i = 1:N,.combine = "cbind") %dopar% {sum(rnorm(N))})
 
 

Proposé par Vincent.

Déjà 2 commentaires. Cliquez ici pour réagir.

Comment connaître le temps d’execution d’une fonction ? system.time

3
dans algorithmique, optimisation, programmer avec R
- ça ne sert à rien -- c\'est interessant - (score de +3 sur 3 votes)
Loading ... Loading ...
Lorsque l’on réalise des scripts qui vont tourner un certain temps avant d’aboutir au résultat final, il est essentiel d’en optimiser le fonctionnement pour gagner du temps. Il nous faut pour cela un bon indicateur : comment savoir le temps que dure une fonction ou un script ?
Vous pouvez utiliser la fonction system.time



 
system.time(for ( i in 1:10000){print(i)})
system.time(for ( i in 1:10000){cat(i)}) 
 

Proposé par kevin.

Déjà 3 commentaires. Cliquez ici pour réagir.

Comment créer une fonction dans R ? : function

8
dans algorithmique, base indispensable, programmer avec R
- ça ne sert à rien -- c\'est interessant - (score de +11 sur 15 votes)
Loading ... Loading ...
R nous donne la possibilité, très pratique, de créer des fonctions personnalisées.
Voici l’architecture globale :
 
 
nomdemafonction<-function(variable1,variable2...)
{
#ici on met le contenu de la fonction (généralement on effectue des transformations aux variables passées en argument)
 
 
 
 
 
return(Variabledesortie)# il s'agit du résultat que va renvoyer la fonction
}
 
#une fois la fonction créée on peut l'utiliser:
 nomdemafonction(varA,varB)
 
 
 


Contrairement à d’autres languages, il n ‘y a pas de contrôle du type de variable que l’on peut utiliser. Il faudra l’inclure dans la fonction pour, par exemple, vérifier que la variable A est bien un vecteur (et pas un data.frame par exemple)

Voici un exemple de fonction, il s’agit d’une fonction simple qui va prendre 2 variables de type « integer » (c’est à dire un chiffre), en faire la somme, en prendre le carré et rajouter la valeur de la première variable.

 
 
monexemple<-function(A,B){
out<-(A+B)^2
out<-out + A
return(out)
}
 
monexemple(2,3)#27
monexemple(8,3)#129
 
 


L’ordre des paramètres est important, il faut les passer dans le même ordre que dans le code de la fonction, ici A puis B.
Il est possible (et même conseillé) de faire autrement en précisant la variable :
 
 
 monexemple(2,3)#27 
 monexemple(3,2)#28
 
 
 monexemple(A=2,B=3)#27
 monexemple(B=3,A=2)#27  
 


Il est possible de définir une valeur par defaut pour certain parametres ( ils deviennent alors optionnel)


 
 
 monexemple2<-function(A,B=10){
out<-(A+B)^2
out<-out + A
return(out)
}
monexemple2(3) #A=3 et B=10
monexemple2(3,10) #A=3 et B=10
monexemple2(3,11) #A=3 et B=11
 
 


Bonus :

Il est possible d’utiliser le symbole « … » dans les paramètres d’une fonction pour indiquer que tous les paramètres supplémentaires seront transmis aux autres fonctions internes.



Proposé par vincent.

Déjà 8 commentaires. Cliquez ici pour réagir.

Comment comparer deux séries de valeurs avec R ?

0
dans algorithmique, base indispensable
- ça ne sert à rien -- c\'est interessant - (score de +23 sur 25 votes)
Loading ... Loading ...
Il est souvent utile de pouvoir comparer deux séries de données en algorithmique. Il existe quelques fonctions qui permettent ceci :

 
#Prenons 2 séries de valeurs
x=c(1,5,8,6,4,9,3,8)
y=c(5,5,4,3,8,7,7)
 


La fonction union(x,y) donne un vecteur composé des éléments qui se trouvent dans x ou dans y (union de x et de y).
 
union(x,y)  #donnera 1 5 8 6 4 9 3 7
union(y,x)  #donnera 5 4 3 8 7 1 6 9
 

NB : on obtient le même résultat avec
unique(c(x,y))


La fonction intersect(x,y) donne un vecteur composé des éléments qui se trouvent à la fois dans x et dans y (intersection de x et de y).
 
 intersect(x,y)  #donnera 5 8 4 3
 intersect(y,x)  #donnera 5 4 3 8
 


Le changement d’ordre des vecteurs x et y dans ces deux fonction ci-dessus n’affecte pas les éléments contenus dans les résultats (excepté leur ordre).


La fonction setdiff(x,y) donne tous les éléments de x qui ne sont pas dans y. Attention setdiff(y,x) donnera tous les éléments de y qui ne sont pas dans x, donc le résultat ne sera pas le même.
 
setdiff(x,y)  #donnera 1 6 9
setdiff(y,x)  #donnera 7
 


La fonction setequal(x,y) retourne la valeur TRUE si x est le même vecteur que y, FALSE sinon.
 
setequal(x,y)  #donnera FALSE
 


La fonction is.element(x,y) retourne un vecteur de la longueur de x composé des valeurs TRUE si l’élément de x se trouve également dans y (n’importe où) et FALSE sinon.
 
 is.element(x,y)  #donnera FALSE TRUE TRUE FALSE TRUE FALSE TRUE TRUE 
#car les éléments qui sont à la 1ère, 4ème et 6ème place dans le vecteur x (c'est-à-dire 1, 6 et 9) ne sont #pas des éléments de y tandis que tous les autres le sont
 
is.element(y,x)  #donnera TRUE TRUE TRUE TRUE TRUE FALSE FALSE 
#car les 5 premiers éléments de y sont également des éléments de x tandis que les deux derniers ne le sont pas
 


Cette liste n’est pas exhaustive. Il existe d’autres fonctions qui peuvent servir telles que :
 
 ?all #qui permet de regarder si une condition est remplie à chaque fois
all(x<=y)  #renvoie TRUE si tous les éléments de x sont inférieurs ou égaux aux éléments de y qui sont à la même place dans le vecteur --> ATTENTION x et y doivent être de même longueur
 
 
 ?any #qui permet de regarder si une condition est remplie sur certains éléments de x et y
 any(x<=y)  #renvoie TRUE si certains des éléments de x sont inférieurs ou égaux aux éléments de y qui sont à la même place dans le vecteur --> ATTENTION x et y doivent être de même longueur 
 
#Exemples :
 x=c(4,5,6)
 y=c(4,6,5)
 
all(x<=y)   #renvoie FALSE car l'élément 3 de x (=6) est supérieur à l'élément 3 de y (=5)
any(x<=y) #renvoie TRUE car les éléments 1 et 2 de x (=4 et 5 respectivement) sont inférieurs ou égaux aux #éléments 1 et 2 de y (=4 et 6 respectivement)
 
 all(x>=y)   #renvoie FALSE car les éléments 1 et 2 de x (=4 et 5 respectivement) sont inférieurs ou égaux aux éléments 1 et 2 de y (=4 et 6 respectivement) 
 any(x>=y) #renvoie TRUE car  l'élément 3 de x (=6) est supérieur à l'élément 3 de y (=5) 
 



N’hésitez pas à tester différents vecteurs x et y et différentes comparaisons de x et de y afin de bien comprendre ce qu’il se passe avec ces différentes fonctions.

Proposé par Benjamin.

Pas encore de commentaire, cliquez ici pour réagir.

Comment faire une boucle While avec R ?

1
dans algorithmique, base indispensable
- ça ne sert à rien -- c\'est interessant - (score de +21 sur 23 votes)
Loading ... Loading ...
i<-0
 
while (i<10){ 
 
print(i)
 
i<-i+1  
 
} 
 
print("on sort de la boucle")

While va réaliser ce qui est écrit entre les accolades {} tant que ce qui est dans les parenthèses () est vrai. Ce code peut donc se traduire de la façon suivante :

i vaut 0 
 
tant que (i est inférieur à 0){ 
 
afficher i 
 
augmenter i de 1
 
}

Dans cet exemple au moment où i vaudra 10, on sortira de la boucle.

Proposé par Vincent.

1 commentaire. Cliquez ici pour réagir.

Comment faire une boucle for avec R ?

11
dans algorithmique, base indispensable
- ça ne sert à rien -- c\'est interessant - (score de +43 sur 43 votes)
Loading ... Loading ...
for ( i in 1:10) { 
 
print(i) 
 
}

Cette commande peut se traduire par :
Pour (i allant de 1 à 10) 
 
{ affiche i}

Il faut noter que les parenthèses () servent à définir la variable et les valeurs qu’elle va prendre successivement à chaque tour de boucle. Les accolades {} servent à délimiter les actions à effectuer pour chacune des valeurs prises par la variable.

IMPORTANT : R n’aime pas vraiment les boucles for, il est beaucoup plus efficace d’utiliser apply. Tout particulièrement pour les très grandes et longues boucles, apply fait cela en une fraction de seconde… alors que for peut mettre plusieurs minutes, ou ne pas réussir.

Proposé par Vincent.

Déjà 11 commentaires. Cliquez ici pour réagir.
Formation logiciel R