Echantillonné semi-aléatoirement sous condition et calcul de moyenne

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

Marine Lalande
Messages : 4
Enregistré le : 25 Sep 2019, 08:40

Echantillonné semi-aléatoirement sous condition et calcul de moyenne

Messagepar Marine Lalande » 25 Sep 2019, 08:49

Bonjour,

Je suis nouvelle sur le forum et dispose d'un jeu de données (dataframe à 3 colonnes) où chaque ligne représente un site (site = colonne 1) prospecté à différentes dates (date = colonne 2) sur lequel on a réalisé un comptage (nb = colonne 3). On dispose de 10 dates et de 4000 sites. Ces derniers sont parfois comptés 10 fois et d'autres moins (présence de NA).
J'aimerais tirer aléatoirement un échantillon des comptages de tous mes sites pour 2 dates, afin de réaliser ensuite une moyenne par site des comptages sur cet échantillon en tenant compte des NA.
J'ai testé plusieurs options:
- via un split mais la création d'une liste de df me bloque pour réaliser les moyennes par ligne avec les fonctions apply.
- via les fonctions subset puis aggregate, mais je n'arrive pas à intégrer un critère aléatoire qui pourrait ressembler à quelque chose du genre subset(monDF, date==sample(monDF$date,2))
Cela me semble tout simple mais j'échoue, vous trouverez surement une solution!

Bonne journée

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Echantillonné semi-aléatoirement sous condition et calcul de moyenne

Messagepar Logez Maxime » 25 Sep 2019, 08:58

Bonjour,

Si j'ai bien compris pour chaque site tu veux tirer au hasard deux dates et faire la moyenne ? Est-ce que ce sont les mêmes dates que tu cherches à tirer d'un site à l'autre ou est-ce que ça n'a pas d'importance.
Dans cette hypothèse avec le package dplyr :

Code : Tout sélectionner

tab %>% head()
  site date nb
1 0001    1  1
2 0002    1  6
3 0003    1  4
4 0004    1 NA
5 0005    1  5
6 0006    1 NA
# juste la sélection des 2 dates par site
tab %>% filter(!is.na(nb)) %>% group_by(site) %>% sample_n(2)
# pour en faire la moyenne
tab %>% filter(!is.na(nb)) %>% group_by(site) %>% sample_n(2) %>% summarise(nb = mean(nb))


Cordialement,
Maxime

Marine Lalande
Messages : 4
Enregistré le : 25 Sep 2019, 08:40

Re: Echantillonné semi-aléatoirement sous condition et calcul de moyenne

Messagepar Marine Lalande » 25 Sep 2019, 09:06

Merci pour votre rapide réponse.
En fait je cherche à dire "dans le jeu de données total, tire toutes les données de comptage de tous les sites pour 2 dates aléatoires".
Donc oui, ce sont les mêmes dates pour tous les sites.
Je ne suis pas super à l'aise avec le package dplyr. Je me documente et teste votre solution, car a priori, je ne comprends pas comment on sait que l'échantillonnage se fait sur le critère de la date avec le code:

Code : Tout sélectionner

tab %>% filter(!is.na(nb)) %>% group_by(site) %>% sample_n(2)

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Echantillonné semi-aléatoirement sous condition et calcul de moyenne

Messagepar Logez Maxime » 25 Sep 2019, 12:14

Re,

mon code n'était pas bon alors par rapport à ce que tu cherches à faire.
Je le ferais à "l'ancienne" : 1) je tire au hasard deux dates, 2) je ne sélectionne que les lignes correspondantes à ces deux dates, iii) je vire les NA, iv) je calcule les moyennes.

Code : Tout sélectionner

dts <- sample(unique(tab$date), 2)
tab2 <- tab[tab$date %in% dts,]
tab2 <- tab2[!is.na(tab2$nb),]

# version dplyr
dts <- sample(unique(tab$date), 2)
tab %>% filter(date %in% dts, !is.na(nb))
Après tout dépend de ce que tu veux faire pour les moyennes.

Cordialement,
Maxime

Marine Lalande
Messages : 4
Enregistré le : 25 Sep 2019, 08:40

Re: Echantillonné semi-aléatoirement sous condition et calcul de moyenne

Messagepar Marine Lalande » 27 Sep 2019, 07:41

Bonjour merci beaucoup.
Problème résolu avec votre code.
Bonne journée


Retourner vers « Questions en cours »

Qui est en ligne

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