Tirage aléatoire"dirigé" dur R

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Mélanie Henriques
Messages : 7
Enregistré le : 27 Sep 2018, 11:51

Tirage aléatoire"dirigé" dur R

Messagepar Mélanie Henriques » 15 Avr 2020, 13:44

Bonjour,

Je cherche comment faire un tirage aléatoire "dirigé" dans en R.
Je voudrais utiliser les forets aléatoires donc je voudrais faire un échantillon de validation et un échantillon test.
La fonction sample() marche mais ne convient pas trop à mes données (biais d'échantillonnage).
En effet, mon étude porte sur la distinction entre coup et chute via 16 variables correspondant à des types de fractures (cotation binaire, 0=absent/1=présent). La base de données (intitulée chcp) est constituée de 235 chutes et 165 coups. Je voudrais donc créer mon échantillon de validation avec 90% des chutes (soit n=211) et 90% des coups (soit n=149); et non 90% (n=360) de l'échantillon total comme je peux l'avoir avec la fonction sample et le script suivant :
set.seed(5678)
perm <- sample(400,360)
app <- chcp[perm,]
valid <- chcp[-perm,]


Voici mes données sur Rcmdr:

str(chcp)
'data.frame': 400 obs. of 16 variables:
$ CONTEXTE: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ F1 : Factor w/ 2 levels "0","1": 1 1 2 1 1 1 1 1 1 1 ...
$ MD3 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ S1 : Factor w/ 2 levels "0","1": 1 1 2 1 1 1 1 1 1 1 ...
$ MD1 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 2 ...
$ MD5 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ T1 : Factor w/ 2 levels "0","1": 2 1 1 1 1 1 1 1 1 1 ...
$ VL1C5 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 1 2 ...
$ VL4C5 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 1 1 ...
$ VL2C5 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 1 1 ...
$ VL3C5 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 1 1 ...
$ PG.1C7 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ E : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 2 1 1 1 ...
$ MA4 : Factor w/ 2 levels "0","1": 2 1 1 2 1 1 2 1 2 1 ...
$ MA5 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ N : Factor w/ 2 levels "0","1": 1 1 1 2 1 1 2 1 2 1 ...




A la suite de nombreuses recherches, je n'arrive toujours pas à créer mon échantillon de validation avec 90% des coups et 90% des chutes, c'est pourquoi j'ai décidé d'écrire cet appel à l'aide.
Voici mon script:

chcp <- readXL("/Users/melaniehenriques/Desktop/stats Faux resume.xlsx",
rownames=TRUE, header=TRUE, na="", sheet="cod2 > =20 ind (2)",
stringsAsFactors=TRUE)
str(chcp)
for (i in 1:16) chcp[,i]=as.factor(chcp[,i])
str(chcp)
chcp_fct <- function(tab=chcp,n1=211,n0=149,fac01=CONTEXTE){
tab0 <- subset(chcp,CONTEXTE==COUP) [4] ERREUR: objet 'COUP' introuvable
tab1 <- subset(chcp,CONTEXTE==CHUTE) [5] ERREUR: objet 'CHUTE' introuvable
newtab0 <- tab0[sample(1:nrow(tab0),n0),]
newtab1 <- tab1[sample(1:nrow(tab1),n1),]
perm <- rbind(newtab0,newtab1)
return(perm)
}
app <- chcp[perm,]
valid <- chcp[-perm,]
library(randomForest)
set.seed(1234)
foret <- randomForest(CONTEXTE~., data = app)
foret
plot(foret)




Ayant des erreurs, je change ma base de données, enfin plutôt ma colonne CONTEXTE: CHUTE en 1 et COUP en 0.
Je relance le script:

chcp <- readXL("/Users/melaniehenriques/Desktop/stats Faux resume.xlsx",
rownames=TRUE, header=TRUE, na="", sheet="cod2 > =20 ind (3)",
stringsAsFactors=TRUE)
str(chcp)
for (i in 1:16) chcp[,i]=as.factor(chcp[,i])
str(chcp)
chcp_fct <- function(tab=chcp,n1=211,n0=149,fac01=CONTEXTE){
tab0 <- subset(chcp,CONTEXTE==0)
tab1 <- subset(chcp,CONTEXTE==1)
newtab0 <- tab0[sample(1:nrow(tab0),n0),]
newtab1 <- tab1[sample(1:nrow(tab1),n1),]
perm <- rbind(newtab0,newtab1)
return(perm)
}
app <- chcp[perm,]. [6] ERREUR: objet 'perm' introuvable
valid <- chcp[-perm,]
library(randomForest)
set.seed(1234)
foret <- randomForest(CONTEXTE~., data = app)
foret
plot(foret)



Je ne sais plus trop quoi faire...Pourriez-vous m'aider svp?
Je vous remercie par avance et vous souhaite une bonne journée.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Tirage aléatoire"dirigé" dur R

Messagepar Mickael Canouil » 16 Avr 2020, 10:26

Bonjour,

j'avoue avoir un peu la flemme d'essayer de déchiffrer/lire le code.
Pourriez-vous utiliser les balises de code (bouton "code" dans l'éditeur) ?

Et pourriez-vous suivre les recommandations ci-après ?

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Mélanie Henriques
Messages : 7
Enregistré le : 27 Sep 2018, 11:51

Re: Tirage aléatoire"dirigé" dur R

Messagepar Mélanie Henriques » 16 Avr 2020, 11:16

Bonjour,

Je cherche comment faire un tirage aléatoire "dirigé" dans en R.
Je voudrais utiliser les forets aléatoires donc je voudrais faire un échantillon de validation et un échantillon test.
La fonction sample() marche mais ne convient pas trop à mes données (biais d'échantillonnage).
En effet, mon étude porte sur la distinction entre coup et chute via 16 variables correspondant à des types de fractures (cotation binaire, 0=absent/1=présent). La base de données (intitulée chcp) est constituée de 235 chutes et 165 coups. Je voudrais donc créer mon échantillon de validation avec 90% des chutes (soit n=211) et 90% des coups (soit n=149); et non 90% (n=360) de l'échantillon total comme je peux l'avoir avec la fonction sample et le script suivant :
set.seed(5678)
perm <- sample(400,360)
app <- chcp[perm,]
valid <- chcp[-perm,]


Voici mes données sur Rcmdr:

Code : Tout sélectionner

str(chcp)
'data.frame': 400 obs. of 16 variables:
$ CONTEXTE: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ F1 : Factor w/ 2 levels "0","1": 1 1 2 1 1 1 1 1 1 1 ...
$ MD3 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ S1 : Factor w/ 2 levels "0","1": 1 1 2 1 1 1 1 1 1 1 ...
$ MD1 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 2 ...
$ MD5 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ T1 : Factor w/ 2 levels "0","1": 2 1 1 1 1 1 1 1 1 1 ...
$ VL1C5 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 1 2 ...
$ VL4C5 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 1 1 ...
$ VL2C5 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 1 1 ...
$ VL3C5 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 1 1 ...
$ PG.1C7 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ E : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 2 1 1 1 ...
$ MA4 : Factor w/ 2 levels "0","1": 2 1 1 2 1 1 2 1 2 1 ...
$ MA5 : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ N : Factor w/ 2 levels "0","1": 1 1 1 2 1 1 2 1 2 1 ...





A la suite de nombreuses recherches, je n'arrive toujours pas à créer mon échantillon de validation avec 90% des coups et 90% des chutes, c'est pourquoi j'ai décidé d'écrire cet appel à l'aide.
Voici mon script:

Code : Tout sélectionner

chcp <- readXL("/Users/melaniehenriques/Desktop/stats Faux resume.xlsx",
rownames=TRUE, header=TRUE, na="", sheet="cod2 > =20 ind (2)",
stringsAsFactors=TRUE)
str(chcp)
for (i in 1:16) chcp[,i]=as.factor(chcp[,i])
str(chcp)
chcp_fct <- function(tab=chcp,n1=211,n0=149,fac01=CONTEXTE){
tab0 <- subset(chcp,CONTEXTE==COUP)        * [4] ERREUR: objet 'COUP' introuvable
tab1 <- subset(chcp,CONTEXTE==CHUTE)      *  [5] ERREUR: objet 'CHUTE' introuvable
newtab0 <- tab0[sample(1:nrow(tab0),n0),]
newtab1 <- tab1[sample(1:nrow(tab1),n1),]
perm <- rbind(newtab0,newtab1)
return(perm)
}
app <- chcp[perm,]
valid <- chcp[-perm,]
library(randomForest)
set.seed(1234)
foret <- randomForest(CONTEXTE~., data = app)
foret
plot(foret)





Ayant des erreurs, je change ma base de données, enfin plutôt ma colonne CONTEXTE: CHUTE en 1 et COUP en 0.
Je relance le script:

Code : Tout sélectionner

chcp <- readXL("/Users/melaniehenriques/Desktop/stats Faux resume.xlsx",
rownames=TRUE, header=TRUE, na="", sheet="cod2 > =20 ind (3)",
stringsAsFactors=TRUE)
str(chcp)
for (i in 1:16) chcp[,i]=as.factor(chcp[,i])
str(chcp)
chcp_fct <- function(tab=chcp,n1=211,n0=149,fac01=CONTEXTE){
tab0 <- subset(chcp,CONTEXTE==0)
tab1 <- subset(chcp,CONTEXTE==1)
newtab0 <- tab0[sample(1:nrow(tab0),n0),]
newtab1 <- tab1[sample(1:nrow(tab1),n1),]
perm <- rbind(newtab0,newtab1)
return(perm)
}
app <- chcp[perm,]              *  [6] ERREUR: objet 'perm' introuvable
valid <- chcp[-perm,]
library(randomForest)
set.seed(1234)
foret <- randomForest(CONTEXTE~., data = app)
foret
plot(foret)



Je ne sais plus trop quoi faire...Pourriez-vous m'aider svp?
Je vous remercie par avance et vous souhaite une bonne journée.

Fred Santos
Messages : 233
Enregistré le : 11 Avr 2009, 10:00
Contact :

Re: Tirage aléatoire"dirigé" dur R

Messagepar Fred Santos » 17 Avr 2020, 06:29

Salut Mélanie,

Ton code n'est toujours pas reproductible, il te faudrait lire les deux liens envoyés par Mikael à ce sujet et éditer ton post pour corriger ça. Si on ne peut pas faire tourner ton code ce sera compliqué de t'aider.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Tirage aléatoire"dirigé" dur R

Messagepar Mickael Canouil » 17 Avr 2020, 06:55

Concrètement si on enlève les "* [4] ERREUR: objet 'COUP' introuvable" et "* [5] ERREUR: objet 'CHUTE' introuvable" qui sont des erreurs évidentes et ne devrait pas figurer dans le code.

Voilà le résultat de votre code dans un "reprex" (voir mon troisième lien)

Code : Tout sélectionner

reprex::reprex({
chcp <- readXL(
  "/Users/melaniehenriques/Desktop/stats Faux resume.xlsx",
  rownames = TRUE,
  header = TRUE,
  na = "",
  sheet = "cod2 > =20 ind (2)",
  stringsAsFactors = TRUE
)
str(chcp)
for (i in 1:16) {
  chcp[, i] <- as.factor(chcp[, i])
}
str(chcp)

chcp_fct <- function(tab = chcp, n1 = 211, n0 = 149, fac01 = CONTEXTE) {
  tab0 <- subset(chcp, CONTEXTE == COUP)
  tab1 <- subset(chcp, CONTEXTE == CHUTE)
  newtab0 <- tab0[sample(1:nrow(tab0), n0), ]
  newtab1 <- tab1[sample(1:nrow(tab1), n1), ]
  perm <- rbind(newtab0, newtab1)
  return(perm)
}
app <- chcp[perm, ]
valid <- chcp[-perm, ]
library(randomForest)
set.seed(1234)
foret <- randomForest(CONTEXTE ~ ., data = app)
foret
plot
(foret)
}) 

Code : Tout sélectionner

chcp <- readXL(
  
"/Users/melaniehenriques/Desktop/stats Faux resume.xlsx",
  
rownames TRUE,
  
header TRUE,
  
na "",
  
sheet "cod2 > =20 ind (2)",
  
stringsAsFactors TRUE
)
#> Error in readXL("/Users/melaniehenriques/Desktop/stats Faux resume.xlsx", : could not find function "readXL"
str(chcp)
#> Error in str(chcp): object 'chcp' not found
for (i in 1:16) {
  
chcp[, i] <- as.factor(chcp[, i])
}
#> Error in is.factor(x): object 'chcp' not found
str(chcp)
#> Error in str(chcp): object 'chcp' not found

chcp_fct <- function(tab chcpn1 211n0 149fac01 CONTEXTE) {
  
tab0 <- subset(chcpCONTEXTE == COUP)
  
tab1 <- subset(chcpCONTEXTE == CHUTE)
  
newtab0 <- tab0[sample(1:nrow(tab0), n0), ]
  
newtab1 <- tab1[sample(1:nrow(tab1), n1), ]
  
perm <- rbind(newtab0newtab1)
  return(
perm)
}
app <- chcp[perm, ]
#> Error in eval(expr, envir, enclos): object 'chcp' not found
valid <- chcp[-perm, ]
#> Error in eval(expr, envir, enclos): object 'chcp' not found
library(randomForest)
#> randomForest 4.6-14
#> Type rfNews() to see new features/changes/bug fixes.
set.seed(1234)
foret <- randomForest(CONTEXTE ~ ., data app)
#> Error in eval(m$data, parent.frame()): object 'app' not found
foret
#> Error in eval(expr, envir, enclos): object 'foret' not found
plot(foret)
#> Error in plot(foret): object 'foret' not found 
Mickaël
mickael.canouil.fr | rlille.fr

Mélanie Henriques
Messages : 7
Enregistré le : 27 Sep 2018, 11:51

Re: Tirage aléatoire"dirigé" dur R

Messagepar Mélanie Henriques » 17 Avr 2020, 08:10

Bonjour,
Tout d'abord, je vous remercie pour vos réponses.
En suivant le lien 2:

Voici mes données (une toute petite partie):

Code : Tout sélectionner

> library(readxl)
> chcp <- read_excel("~/Desktop/aide stat.xlsx")
                                                                         
> str(chcp)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   6 obs. of  7 variables:
 $ IND     : num  17 18 19 36 37 38
 $ CONTEXTE: chr  "COUP" "COUP" "COUP" "CHUTE" ...
 $ F1      : num  0 0 0 0 0 1
 $ MD3     : num  0 0 0 0 0 0
 $ S1      : num  0 0 0 0 0 0
 $ MD1     : num  0 0 1 0 0 0
 $ MD5     : num  0 0 0 0 0 0
> for (i in 1:6) chcp[,i]=as.factor(chcp[,i])
Erreur : Must use a vector in `[`, not an object of class matrix.
Run `rlang::last_error()` to see where the error occurred.
> str(chcp)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   6 obs. of  7 variables:
 $ IND     : num  17 18 19 36 37 38
 $ CONTEXTE: chr  "COUP" "COUP" "COUP" "CHUTE" ...
 $ F1      : num  0 0 0 0 0 1
 $ MD3     : num  0 0 0 0 0 0
 $ S1      : num  0 0 0 0 0 0
 $ MD1     : num  0 0 1 0 0 0
 $ MD5     : num  0 0 0 0 0 0
> data.frame(chcp)
  IND CONTEXTE F1 MD3 S1 MD1 MD5
1  17     COUP  0   0  0   0   0
2  18     COUP  0   0  0   0   0
3  19     COUP  0   0  0   1   0
4  36    CHUTE  0   0  0   0   0
5  37    CHUTE  0   0  0   0   0
6  38    CHUTE  1   0  0   0   0
> dput(chcp)
structure(list(IND = c(17, 18, 19, 36, 37, 38), CONTEXTE = c("COUP",
"COUP", "COUP", "CHUTE", "CHUTE", "CHUTE"), F1 = c(0, 0, 0, 0,
0, 1), MD3 = c(0, 0, 0, 0, 0, 0), S1 = c(0, 0, 0, 0, 0, 0), MD1 = c(0,
0, 1, 0, 0, 0), MD5 = c(0, 0, 0, 0, 0, 0)), row.names = c(NA,
-6L), class = c("tbl_df", "tbl", "data.frame"))




Le code:

Code : Tout sélectionner

library(readxl)
chcp <- read_excel([color=#FF0000]"~/Desktop/aide stat.xlsx"[/color])
str(chcp)
for (i in 1:6) chcp[,i]=as.factor(chcp[,i])
str(chcp)
data.frame(chcp)
dput(chcp)
chcp_fct <- function(tab=chcp,n1=2,n0=1,fac01=CONTEXTE){
tab0 <- subset(chcp,CONTEXTE==COUP)
tab1 <- subset(chcp,CONTEXTE==CHUTE)
newtab0 <- tab0[sample(1:nrow(tab0),n0),]
newtab1 <- tab1[sample(1:nrow(tab1),n1),]
perm <- rbind(newtab0,newtab1)
return(perm)
}
app <- chcp[perm,]
valid <- chcp[-perm,]
library(randomForest)
set.seed(1234)
foret <- randomForest(CONTEXTE~., data = app)
foret
plot(foret)



Le reprex (après plusieurs essais, je n'ai pu que le présenter comme suit):

library(reprex)
library(readxl)
chcp <- read_excel("~/Desktop/aide stat.xlsx")
str(chcp)
#> Classes 'tbl_df', 'tbl' and 'data.frame': 6 obs. of 7 variables:
#> $ IND : num 17 18 19 36 37 38
#> $ CONTEXTE: chr "COUP" "COUP" "COUP" "CHUTE" ...
#> $ F1 : num 0 0 0 0 0 1
#> $ MD3 : num 0 0 0 0 0 0
#> $ S1 : num 0 0 0 0 0 0
#> $ MD1 : num 0 0 1 0 0 0
#> $ MD5 : num 0 0 0 0 0 0

for (i in 1:6) chcp[,i]=as.factor(chcp[,i])
#> Error: Must use a vector in `[`, not an object of class matrix.
str(chcp)
#> Classes 'tbl_df', 'tbl' and 'data.frame': 6 obs. of 7 variables:
#> $ IND : num 17 18 19 36 37 38
#> $ CONTEXTE: chr "COUP" "COUP" "COUP" "CHUTE" ...
#> $ F1 : num 0 0 0 0 0 1
#> $ MD3 : num 0 0 0 0 0 0
#> $ S1 : num 0 0 0 0 0 0
#> $ MD1 : num 0 0 1 0 0 0
#> $ MD5 : num 0 0 0 0 0 0

data.frame(chcp)
#> IND CONTEXTE F1 MD3 S1 MD1 MD5
#> 1 17 COUP 0 0 0 0 0
#> 2 18 COUP 0 0 0 0 0
#> 3 19 COUP 0 0 0 1 0
#> 4 36 CHUTE 0 0 0 0 0
#> 5 37 CHUTE 0 0 0 0 0
#> 6 38 CHUTE 1 0 0 0 0

dput(chcp)
#> structure(list(IND = c(17, 18, 19, 36, 37, 38), CONTEXTE = c("COUP",
#> "COUP", "COUP", "CHUTE", "CHUTE", "CHUTE"), F1 = c(0, 0, 0, 0,
#> 0, 1), MD3 = c(0, 0, 0, 0, 0, 0), S1 = c(0, 0, 0, 0, 0, 0), MD1 = c(0,
#> 0, 1, 0, 0, 0), MD5 = c(0, 0, 0, 0, 0, 0)), row.names = c(NA,
#> -6L), class = c("tbl_df", "tbl", "data.frame"))

chcp_fct <- function(tab=chcp,n1=2,n0=1,fac01=CONTEXTE){
tab0 <- subset(chcp,CONTEXTE==COUP)
tab1 <- subset(chcp,CONTEXTE==CHUTE)
newtab0 <- tab0[sample(1:nrow(tab0),n0),]
newtab1 <- tab1[sample(1:nrow(tab1),n1),]
perm <- rbind(newtab0,newtab1)
return(perm)
}
app <- chcp[perm,]
#> Error in `[.tbl_df`(chcp, perm, ): objet 'perm' introuvable
valid <- chcp[-perm,]
#> Error in `[.tbl_df`(chcp, -perm, ): objet 'perm' introuvable
library(randomForest)
#> randomForest 4.6-14
#> Type rfNews() to see new features/changes/bug fixes.

set.seed(1234)
foret <- randomForest(CONTEXTE~., data = app)
#> Error in eval(m$data, parent.frame()): objet 'app' introuvable
foret
#> Error in eval(expr, envir, enclos): objet 'foret' introuvable
plot(foret)
#> Error in plot(foret): objet 'foret' introuvable

Pour le code et reprex, vous avez été plus rapide que moi (reprex ne semble pas marcher sur Rcmdr d'où mon temps de réponse). J'ai tout relancé avec l'échantillon plus petit de ma base de données.
Avez-vous besoin que je vous donne d'autres données?

Cordialement,
Mélanie

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Tirage aléatoire"dirigé" dur R

Messagepar Mickael Canouil » 20 Avr 2020, 12:37

SI le reprex indique des erreurs, c'est que votre code n'est par définition pas reproductible pour les erreurs indiquées.
Ainsi, je vous suggère de débuguer votre code, comme par exemple la partie suivante

Code : Tout sélectionner

 for (i in 1:6) chcp[,i]=as.factor(chcp[,i])
#> Erreur : Must use a vector in `[`, not an object of class matrix.       


Aussi, à quoi sert votre fonction chcp_fct(), puisque vous ne l'utilisez pas ?
Ce qui est en lien avec l'erreur

Code : Tout sélectionner

app <- chcp[perm,]
#> Error in `[.tbl_df`(chcp, perm, ): objet 'perm' introuvable       

"perm" n'existe pas en dehors de chcp_fct(), donc forcément il y a une erreur.
Par ailleurs, votre fonction utilise des arguments (et des valeurs par défaut) qui ne sont pas utilisé, comme "fac01 = CONTEXTE".
Ou "CONTEXTE" est visiblement une variable, mais n'est à aucun moment dans votre code initialisé et n'existe donc pas (mêm si cela ne se voit pas puisque la fonction ne l'utilise pas).
De plus, COUP et CHUTE sont les valeurs de la colonne "CONTEXTE" de votre jeu de données "chcp" (qui d'ailleurs devrait être "tab" dans votre fonction) et devrait donc être entre guillemets.

Code : Tout sélectionner

chcp_fct <- function(tab = chcp, n1 = 2, n0 = 1, fac01 = CONTEXTE) {
  tab0 <- subset(chcp, CONTEXTE == COUP)
  tab1 <- subset(chcp, CONTEXTE == CHUTE)
  newtab0 <- tab0[sample(1:nrow(tab0), n0), ]
  newtab1 <- tab1[sample(1:nrow(tab1), n1), ]
  rbind(newtab0, newtab1)


Visiblement, vous ne maitrisez pas les bases des fonctions dans R (et plus généralement), je vous invite à vous documenter sur celles-ci.

Voici une correction de votre fonction (qui de toute façon ne vous servira pas dans votre code tel qu'il est) :

Code : Tout sélectionner

chcp <- structure(
  list(
    IND = c(17, 18, 19, 36, 37, 38),
    CONTEXTE = c("COUP", "COUP", "COUP", "CHUTE", "CHUTE", "CHUTE"),
    F1 = c(0, 0, 0, 0, 0, 1),
    MD3 = c(0, 0, 0, 0, 0, 0),
    S1 = c(0, 0, 0, 0, 0, 0),
    MD1 = c(0, 0, 1, 0, 0, 0),
    MD5 = c(0, 0, 0, 0, 0, 0)
  ),
  row.names = c(NA, -6L),
  class = c("tbl_df", "tbl", "data.frame")

Code : Tout sélectionner

chcp_fct <- function(tab, n1, n0, fac01) {
  tab0 <- tab[tab[, fac01] == "COUP", ]
  tab1 <- tab[tab[, fac01] == "CHUTE", ]
  rbind(
    tab0[sample(1:nrow(tab0), n0), ], 
    tab1
[sample(1:nrow(tab1), n1), ]
  )

Code : Tout sélectionner

chcp_fct(chcp, 2, 1, "CONTEXTE")
#>   IND CONTEXTE F1 MD3 S1 MD1 MD5
#> 2  18     COUP  0   0  0   0   0
#> 6  38    CHUTE  1   0  0   0   0
#> 5  37    CHUTE  0   0  0   0   0   



Mise à part l'ensemble des problèmes de votre code.
Votre objectif est de sélectionner 90 % des valeurs de "CONTEXTE", à savoir "COUP" et "CHUTE".
Voici un exemple reproductible avec deux solutions.

Code : Tout sélectionner

chcp <- data.frame(
  IND = 1L:200L,
  CONTEXTE = rep(c("COUP", "CHUTE"), each = 100L),
  stringsAsFactors = FALSE
)

En R base :

Code : Tout sélectionner

set.seed(200420)
chcp_90 <- do.call("rbind",
  by(
    data = chcp, 
    INDICES 
= chcp[["CONTEXTE"]], 
    FUN 
= function(data) data[sample(1:nrow(data), floor(0.9 * nrow(data))), ]
  )
)
nrow(chcp_90)
#> [1] 180  

Avec la libraire "dplyr"

Code : Tout sélectionner

library("dplyr")
set.seed(200420)
chcp_90 <- chcp %>% 
  group_by
(CONTEXTE) %>% 
  sample_frac
(0.9) %>% 
  ungroup
()
nrow(chcp_90)
#> [1] 180  


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Mélanie Henriques
Messages : 7
Enregistré le : 27 Sep 2018, 11:51

Re: Tirage aléatoire"dirigé" dur R

Messagepar Mélanie Henriques » 23 Avr 2020, 08:58

Bonjour,
Super ça marche, merci bp!!
Je n'ai malheureusement pas été réellement formée à R mais j'essaye d'y remédier et j'avoue que ce n'est pas facile tous les jours...
Encore une fois merci!
Bonne continuation,


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité