Sélection aléatoire des modalités d'un facteur

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

Sylvain Gaudin
Messages : 25
Enregistré le : 10 Jan 2017, 06:41

Sélection aléatoire des modalités d'un facteur

Messagepar Sylvain Gaudin » 11 Jan 2024, 18:04

Bonjour,
Je possède un jeu de données de ce style :

Code : Tout sélectionner

F1 <- factor(rep(c("A","B","C","D"), each = 10))
F2 <- c(rnorm(40, mean = 1, sd = 0.2))
df <- data.frame(F1,F2)

Je souhaite travailler sur une sélection aléatoire en fonction du facteur F1 (par exemple, ne retenir que deux modalités sur les quatre (A et C, ou A et D, etc.) et ne garder que les lignes correspondant à ces deux facteurs. Tous les essais que j'ai réalisés sélectionnent des lignes, mais je n'arrive pas à trouver la syntaxe pour effectuer une sélection aléatoire parmi les modalités du facteur. Avez-vous des idées ? Merci.

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: Sélection aléatoire des modalités d'un facteur

Messagepar Maxime Deniaux » 11 Jan 2024, 18:14

Bonsoir,

je sais pas si tu cherches une fonction toute faite pour faire ça mais de mon côté je ferais simplement un tirage au sort et puis un filtre :

Code : Tout sélectionner

tas <- sample(x = levels(F1), size = 2, replace = F)
dfbis <- df %>% filter(F1 %in% tas)

Sylvain Gaudin
Messages : 25
Enregistré le : 10 Jan 2017, 06:41

Re: Sélection aléatoire des modalités d'un facteur

Messagepar Sylvain Gaudin » 11 Jan 2024, 18:22

Merci Maxime, ça fonctionne. J'avais essayé quelque chose de très proche, mais je n'avais pas pensé à : x = levels(F1). Je mettais F1 à la place de levels(F1) et ça ne fonctionnait pas !

Merci ;-))

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: Sélection aléatoire des modalités d'un facteur

Messagepar Maxime Deniaux » 11 Jan 2024, 18:41

En fait tu aurais même pu réécrire le vecteur avec les 4 valeurs uniques, surtout car il n'y a que 4 valeurs.

Si c'est un vecteur avec des dizaines de valeurs uniques (voire plus), bon c'est plus difficile (surtout plus long), et là tu peux par exemple utiliser la fonction unique().

Dans ton cas, cela aurait été unique(F1).

J'ai pas testé mais en théorie, ça aurait fonctionné aussi.

Puis là, tu avais déjà utilisé la fonction factor, c'est pour cela que j'ai dans un premier temps proposé d'utiliser levels().

Code : Tout sélectionner

tas <- sample(x = unique(F1), size = 2, replace = F)
dfbis <- df %>% filter(F1 %in% tas)

ou

tas <- sample(x = c('A','B','C','D'), size = 2, replace = F)
dfbis <- df %>% filter(F1 %in% tas)



PS : Juste F1 peut fonctionner je pense mais pas à tous les coups. Tu peux tirer par exemple 2 fois 'C' comme tirer 'A' et 'B'. Pas possible avec les autres solutions proposées, sauf erreur de ma part.

Bonne soirée !


Retourner vers « Questions en cours »

Qui est en ligne

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

cron