Comparaison de 2 dataframes selon plusieurs colonnes

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

Jérémy Dechartre
Messages : 5
Enregistré le : 24 Mar 2014, 14:13

Comparaison de 2 dataframes selon plusieurs colonnes

Messagepar Jérémy Dechartre » 22 Juin 2017, 09:35

Bonjour à tous,

Après de nombreuses heures à me casser la tête sur Excel et mes souvenirs sur R étant lointains, je me permets de vous solliciter car j’aurais besoin de votre aide.

Pour resituer le contexte, il s’agit de données issues de 2 enregistreurs d’ultrasons pour les chauves-souris. Les enregistreurs étaient placés de part et d’autre d’une route nationale d’où le tableau « Nord » et le tableau « Sud ». L’objectif de l’étude est de démontrer que les chauves-souris franchissent la route.

Pour cela, j’ai besoin de comparer ligne par ligne mes 2 tableaux « Nord » et « Sud » en prenant en compte les colonnes suivantes : Date_contact ; H_contact ; Esp.
L’objectif de l’analyse est de comparer les dates (Date_contact), heures (H_contact) et espèces (Esp) enregistrées dans chacun des 2 tableaux.
Pour cela, pour la même (Date_contact) et la même (Esp) dans les deux tableaux, je souhaite faire la soustraction (H_contact) la plus proche. Le résultat, positif ou négatif me donnera une indication sur le sens de déplacement de la chauves-souris et sur son temps de survol de la route.

PS : Il est normal que les 2 tableaux ne comportent pas le même nombre de ligne car une chauves-souris enregistrée d’un côté de la route ne l’a pas forcément été de l’autre côté.

Merci d’avance pour votre aide !

Nord :
Date_contact H_contact Contact Esp
13/03/2017 19:28:04 Principal Rhifer
13/03/2017 19:32:14 Principal Rhihip
13/03/2017 19:32:14 Secondaire Rhihip
13/03/2017 19:33:42 Principal Pipkuh
13/03/2017 19:33:48 Principal Pipkuh
13/03/2017 19:34:42 Principal Barbar
13/03/2017 19:37:22 Principal Minsch
13/03/2017 19:41:32 Principal Pipkuh
13/03/2017 19:46:26 Principal Barbar
13/03/2017 19:51:50 Principal Pipnat
13/03/2017 19:51:54 Principal Pipkuh
13/03/2017 19:52:44 Principal Rhifer
13/03/2017 19:56:56 Principal Myomyo
13/03/2017 19:57:46 Principal Myodau
13/03/2017 20:02:40 Principal Myodau
13/03/2017 20:02:46 Principal Myodau
13/03/2017 20:03:14 Principal Minsch
13/03/2017 20:05:18 Principal Myobec
13/03/2017 20:09:08 Principal Barbar
13/03/2017 20:09:08 Secondaire Myodau


Sud :
Date_contact H_contact Contact Esp
13/03/2017 19:29:16 Principal Rhihip
13/03/2017 19:29:16 Secondaire Rhihip
13/03/2017 19:31:26 Principal Barbar
13/03/2017 19:33:52 Principal Pipnat
13/03/2017 19:34:18 Principal Rhihip
13/03/2017 19:34:18 Secondaire Rhihip
13/03/2017 19:37:24 Principal Minsch
13/03/2017 19:47:20 Principal Rhifer
13/03/2017 19:51:46 Principal Pipkuh
13/03/2017 19:51:52 Principal Pipnat
13/03/2017 19:52:30 Principal Rhifer
13/03/2017 19:52:36 Principal Rhifer
13/03/2017 19:52:42 Principal Barbar
13/03/2017 19:56:54 Principal Barbar
13/03/2017 19:57:50 Principal Myodau
13/03/2017 19:58:38 Principal Barbar
13/03/2017 20:01:22 Principal Rhifer

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

Re: Comparaison de 2 dataframes selon plusieurs colonnes

Messagepar Pierre-Yves Berrard » 22 Juin 2017, 09:55

Bonjour,

À première vue, je procéderais comme ceci :

  • Dans chaque table, ajouter une colonne POSITION qui prendra les valeurs "Nord" et "Sud".
  • Concaténer les deux tables
  • Trier par ESP, DATE_CONTACT, H_CONTACT.
  • Calculer une différence de temps si la position à la ligne n est différente de la ligne n-1

(à noter que cet algorithme peut se mettre en oeuvre aussi bien en Excel qu'en R)
PY

Jérémy Dechartre
Messages : 5
Enregistré le : 24 Mar 2014, 14:13

Re: Comparaison de 2 dataframes selon plusieurs colonnes

Messagepar Jérémy Dechartre » 22 Juin 2017, 12:41

Merci pour votre réponse Pierre-Yves.

Je viens d'essayer votre technique sous Excel mais sans succès.
D'autres idées ?
Peut-être que je ne procède pas de la bonne manière...

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

Re: Comparaison de 2 dataframes selon plusieurs colonnes

Messagepar Pierre-Yves Berrard » 24 Juin 2017, 07:53

Traduction en R de mon post précédent :

Code : Tout sélectionner

nord$position <- "Nord"
sud$position <- "Sud"
nord_sud <- bind_rows(nord, sud)

library(dplyr)
res <-
  nord_sud %>%
  mutate(
    contact_time = as.POSIXct(
      paste(Date_contact, H_contact),
      format = "%d/%m/%Y %H:%M:%S"
    )
  ) %>%
  arrange(Esp, contact_time) %>%
  group_by(Esp) %>%
  filter(
    lag(position) != position | lead(position) != position
  ) %>%
  mutate(
    tps_s = difftime(
      contact_time,
      lag(contact_time),
      units = "secs"
    )
  )
PY

Jérémy Dechartre
Messages : 5
Enregistré le : 24 Mar 2014, 14:13

Re: Comparaison de 2 dataframes selon plusieurs colonnes

Messagepar Jérémy Dechartre » 26 Juin 2017, 08:44

Merci Pierre-Yves pour votre aide, je viens d'appliquer votre script et ça fonctionne presque...

Le seul problème c'est lorsque l'on trie par "contact_time", on se retrouve parfois avec plusieurs ligne à la suite de l'enregistreur "Nord" ou "Sud" et donc la soustraction de "contact_time" s'effectue entre 2 lignes du même enregistreur.

Pour que cela fonctionne correctement, il faudrait rajouter une dernière condition dans la formule de soustraction qui indique que :
Si "position" à la ligne n est égale à "position" de la ligne n-1, alors NA.

Qu'en pensez vous ?

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

Re: Comparaison de 2 dataframes selon plusieurs colonnes

Messagepar Pierre-Yves Berrard » 26 Juin 2017, 09:39

Je pensais avoir géré ça avec :

Code : Tout sélectionner

  filter(
    lag(position) != position | lead(position) != position
  )

Vous pouvez donner un extrait de quelques lignes qui ne donne pas le résultat escompté ?
PY

Jérémy Dechartre
Messages : 5
Enregistré le : 24 Mar 2014, 14:13

Re: Comparaison de 2 dataframes selon plusieurs colonnes

Messagepar Jérémy Dechartre » 26 Juin 2017, 14:15

Voilà quelques lignes du résultat :

Date_contact H_contact Contact Esp position contact_time tps_s
1 13/03/2017 19:31:26 Principal Barbar Sud 13/03/2017 19:31 NA
2 13/03/2017 19:34:00 Principal Barbar Nord 13/03/2017 19:34 154
3 13/03/2017 19:46:00 Principal Barbar Nord 13/03/2017 19:46 720
4 13/03/2017 19:52:42 Principal Barbar Sud 13/03/2017 19:52 402
5 13/03/2017 20:06:08 Principal Barbar Sud 13/03/2017 20:06 806
6 13/03/2017 20:09:00 Principal Barbar Nord 13/03/2017 20:09 172
7 13/03/2017 20:09:00 Principal Barbar Nord 13/03/2017 20:09 0
8 13/03/2017 20:09:06 Principal Barbar Sud 13/03/2017 20:09 6
9 13/03/2017 20:10:00 Secondaire Barbar Nord 13/03/2017 20:10 54
10 13/03/2017 20:10:06 Principal Barbar Sud 13/03/2017 20:10 6
11 13/03/2017 20:11:00 Principal Barbar Nord 13/03/2017 20:11 54
12 13/03/2017 20:11:00 Principal Barbar Nord 13/03/2017 20:11 0
13 13/03/2017 20:11:06 Principal Barbar Sud 13/03/2017 20:11 6
14 13/03/2017 20:11:48 Principal Barbar Sud 13/03/2017 20:11 42
15 13/03/2017 20:12:00 Principal Barbar Nord 13/03/2017 20:12 12
16 13/03/2017 20:12:00 Principal Barbar Nord 13/03/2017 20:12 0
17 13/03/2017 20:12:18 Principal Barbar Sud 13/03/2017 20:12 18
18 13/03/2017 20:13:00 Principal Barbar Nord 13/03/2017 20:13 42

Jérémy Dechartre
Messages : 5
Enregistré le : 24 Mar 2014, 14:13

Re: Comparaison de 2 dataframes selon plusieurs colonnes

Messagepar Jérémy Dechartre » 05 Juil 2017, 12:27

Bonjour,

je crois que j'ai réussi à résoudre mon soucis en supprimant "| lead(position) != position "


Retourner vers « Questions en cours »

Qui est en ligne

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