Transformation jeu de données

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

Tomas leon
Messages : 51
Enregistré le : 09 Jan 2018, 16:12

Transformation jeu de données

Messagepar Tomas leon » 22 Jan 2018, 14:45

Bonjour à tous,

j'ai une question technique pour vous s'il vous plait.

j'ai un jeu de données dans lequel 1 ligne = 1 séance d'observation. J'ai plusieurs variables explicatives de l'observation : nombre d'observateurs expérimentés / débutants / superficie de la zone / etc, etc... et une variables à expliquer : le nombre d'oiseaux comptés. Dans mon jeu de donnée j'ai également l'information sur : "nombre de mâles comptés", "nombre de femelles comptés", "nombre de mâles adultes comptés", "nombre de femelles adultes comptés" (par séance d'observation, par exemple pour une séance : "nombre d'oiseaux" = 15, "femelle" = 6, mâle ="9", "mâle adulte" = 2 etc...).

Dans le cadre d'une analyse exploratoire, j'aimerais répondre à la question : "est ce que le "type" des oiseaux comptés (jeune/vieux/mâle/femelle) est influencé par les variables explicatives, du genre: il y a beaucoup de "jeunes femelles" comptés lorsqu'il y'a beaucoup d' "observateurs expérimentés".

Pour cela j'aimerais transformer mon tableau pour qu'au lieu d'avoir 1 ligne = 1 séance de comptage, j'aurais 1 ligne = 1 oiseau compté avec en facteur les différents level "mâle", "femelle", "mâle adulte" .... etc... (Pour que je puisse faire une ACM par la suite).

Je passerais du coups de x lignes dans mon tableau à x multiplié par y oiseaux observés.

Voila, je ne sais pas trop comment réussir à transformer mon tableau...

Je vous remercie pour votre aide !

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Transformation jeu de données

Messagepar Pierre-Yves Berrard » 22 Jan 2018, 15:47

Bonjour,

Une solution avec les colonnes suivantes dans les données de départ :
  • MA = nombre de mâles adultes
  • FA = nombre de femelles adultes
  • ME = nombre de mâles non adultes
  • FE = nombre de femelles non adultes

Code : Tout sélectionner

depart <- data.frame(
  Seance = as.character(1:2),
  MA = c(2L, 1L),
  FA = c(1L, 0L),
  ME = c(0L, 2L),
  FE = c(1L, 3L)
)

Code : Tout sélectionner

library(dplyr) # pour mutate_at et %>%
library(tidyr) # pour unnest et separate

res <-
  depart %>%
  unnest(
    SEXE_AGE =
      Map(
        function(w, x, y, z) {
          c(
            rep("mâle-adulte", w),
            rep("femelle-adulte", x),
            rep("mâle-non adulte", y),
            rep("femelle-non adulte", z)
          )
        },
        MA, FA, ME, FE
      )
  ) %>%
  separate(SEXE_AGE, into = c("SEXE", "AGE"), sep = "-") %>%
  mutate_at(c("SEXE", "AGE"), as.factor)
PY

Tomas leon
Messages : 51
Enregistré le : 09 Jan 2018, 16:12

Re: Transformation jeu de données

Messagepar Tomas leon » 22 Jan 2018, 17:14

Salut Pierre-Yves,

Merci pour t'as réponse,

J'ai fais exactement la même chose avec mon jeu de données et je me confronte au message suivant : " Error in mutate_impl(.data, dots) :
Evaluation error: argument 'times' incorrect. " (ton exemple fonctionne parfaitement ; je ne sais pas si c'est important mais j'ai oublié de mentionner que les séances sont identifiables par une date dd-mm-aaaa en POSIXc, mais même en les retirants ça ne fonctionne pas)


De plus j'ai beaucoup de séances d'observations à 0 oiseau observé.
Si je reprend ton exemple avec une séance à 0 observation

Code : Tout sélectionner

depart <- data.frame(
  Seance = as.character(1:3),
  MA = c(2L, 1L, 0L),
  FA = c(1L, 0L, 0L),
  ME = c(0L, 2L, 0L),
  FE = c(1L, 3L, 0L)
)


la séance 3 n'apparaitra pas dans le . Mais si je me place dans la situation dans laquelle "je demande à l'oiseau" par quelles modalités il a été comptés, une observation à 0 n'as pas de sens... Je ne sais pas si c'est pertinent et possible de faire apparaitre une 5ieme modalité "pas de comptage" dans la transformation de mon tableau..


Et du coup dans mon cas comme je voulais avoir qu'une seule variable factorielle à 4 modalités j'ai retiré ton code

Code : Tout sélectionner

%>%
  separate(SEXE_AGE, into = c("SEXE", "AGE"), sep = "-") %>%
  mutate_at(c("SEXE", "AGE"), as.factor)
, mais c'est cool d'avoir eu l'exemple, merci !

Auriez-vous une solution s'il vous plait ?

Merci à tous

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Transformation jeu de données

Messagepar Pierre-Yves Berrard » 22 Jan 2018, 19:54

Tomas leon a écrit :J'ai fais exactement la même chose avec mon jeu de données et je me confronte au message suivant : " Error in mutate_impl(.data, dots) :
Evaluation error: argument 'times' incorrect. " (ton exemple fonctionne parfaitement ; je ne sais pas si c'est important mais j'ai oublié de mentionner que les séances sont identifiables par une date dd-mm-aaaa en POSIXc, mais même en les retirants ça ne fonctionne pas)

Pourrais-tu donner un extrait minimal de ton jeu de données qui génère le message d'erreur ?
PY

Tomas leon
Messages : 51
Enregistré le : 09 Jan 2018, 16:12

Re: Transformation jeu de données

Messagepar Tomas leon » 23 Jan 2018, 16:51

Salut Pierre-Yves,

Cette erreur m'a fait vérifier mon jeu de données, et il s'avère qu'il contient pas mal d'erreurs de prises de notes (pas évidentes à voir dans 15 000 lignes). Par exemple, la différence entre "ensemble des mâles" et "mâles adultes" donnerait une valeur de "mâles jeunes" mais cette soustraction engendre des valeurs négatives. Sans ces valeurs négatives ton code fonctionne à priori, mais il me faut encore quelques jours de travail pour me prononcer sur la réussite finale (je pense que cela devrait le faire).

Encore merci ! !


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité