[Résolu] Fusionner deux data.frame par une date et un intervalle

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

Nicolas Moulin
Messages : 2
Enregistré le : 28 Jan 2019, 17:13

[Résolu] Fusionner deux data.frame par une date et un intervalle

Messagepar Nicolas Moulin » 29 Jan 2019, 10:20

Bonjour,

D'habitude j'utilise les autres réponses aux questions pour m'en sortir (d’ailleurs merci beaucoup pour votre aide!), mais pour une fois je n'arrive pas à trouver la solution à mon problème sur le forum, du coup le voici:

Je dispose de deux data.frame : le premier a une variable date_heure, le deuxième des intervalles de temps dans le même format. Je souhaiterais fusionner ces deux data.frame selon la condition suivante: ma variable date_heure "fit" les intervalles de mon deuxième data.frame.

Code : Tout sélectionner

> df1 <-data.frame(timestamps=c("2016-06-04 01:27:38","2016-06-04 02:09:09","2016-06-04 03:19:47","2016-06-04 04:53:24",
"2016-06-04 22:16:33","2016-06-04 23:13:12","2016-06-05 00:10:07","2016-06-05 00:45:50","2016-06-05 01:01:06",
"2016-06-05 01:59:00","2016-06-05 02:56:34","2016-06-05 03:37:18"),variable2=c(27,18,15,12,14,39,17,9,10,2,21,31))
> df2 <-data.frame(interval=c("2016-06-04 21:37:35 UTC--2016-06-04 21:37:47 UTC","2016-06-04 21:37:47 UTC--2016-06-04 22:08:34 UTC",
 "2016-06-04 22:08:34 UTC--2016-06-04 22:08:45 UTC","2016-06-04 22:08:45 UTC--2016-06-04 22:08:54 UTC",
 "2016-06-04 22:08:54 UTC--2016-06-04 22:09:04 UTC","2016-06-04 22:09:04 UTC--2016-06-04 22:09:13 UTC",
 "2016-06-04 22:09:13 UTC--2016-06-04 22:09:23 UTC","2016-06-04 22:09:23 UTC--2016-06-04 22:09:33 UTC",
 "2016-06-04 22:09:33 UTC--2016-06-04 22:09:43 UTC","2016-06-04 22:09:43 UTC--2016-06-04 22:09:53 UTC",
 "2016-06-04 22:09:53 UTC--2016-06-04 22:10:03 UTC","2016-06-04 22:10:03 UTC--2016-06-04 22:10:13 UTC",
 "2016-06-04 22:10:13 UTC--2016-06-04 22:10:23 UTC","2016-06-04 22:10:23 UTC--2016-06-04 22:10:37 UTC",
 "2016-06-04 22:10:37 UTC--2016-06-04 22:10:45 UTC","2016-06-04 22:10:45 UTC--2016-06-04 22:10:54 UTC",
 "2016-06-04 22:10:54 UTC--2016-06-04 22:11:05 UTC","2016-06-04 22:11:05 UTC--2016-06-04 22:11:14 UTC",
 "2016-06-04 22:11:14 UTC--2016-06-04 22:11:25 UTC","2016-06-04 22:11:25 UTC--2016-06-04 22:11:31 UTC",
 "2016-06-04 22:11:31 UTC--2016-06-04 22:11:44 UTC","2016-06-04 22:11:44 UTC--2016-06-04 22:11:55 UTC",
 "2016-06-04 22:11:55 UTC--2016-06-04 22:12:04 UTC","2016-06-04 22:12:04 UTC--2016-06-04 22:12:13 UTC",
 "2016-06-04 22:12:13 UTC--2016-06-04 22:12:25 UTC","2016-06-04 22:12:25 UTC--2016-06-04 22:12:36 UTC",
 "2016-06-04 22:12:36 UTC--2016-06-04 22:12:47 UTC","2016-06-04 22:12:47 UTC--2016-06-04 22:12:55 UTC",
 "2016-06-04 22:12:55 UTC--2016-06-04 22:13:04 UTC","2016-06-04 22:13:04 UTC--2016-06-04 22:13:18 UTC",
 "2016-06-04 22:13:18 UTC--2016-06-04 22:44:04 UTC","2016-06-04 22:44:04 UTC--2016-06-04 22:44:11 UTC",
 "2016-06-04 22:44:11 UTC--2016-06-04 22:44:22 UTC","2016-06-04 22:44:22 UTC--2016-06-04 22:44:32 UTC",
 "2016-06-04 22:44:32 UTC--2016-06-04 22:44:41 UTC","2016-06-04 22:44:41 UTC--2016-06-04 22:44:51 UTC",
 "2016-06-04 22:44:51 UTC--2016-06-04 22:45:01 UTC","2016-06-04 22:45:01 UTC--2016-06-04 22:45:11 UTC",
 "2016-06-04 22:45:11 UTC--2016-06-04 22:45:21 UTC","2016-06-04 22:45:21 UTC--2016-06-04 22:45:33 UTC",
 "2016-06-04 22:45:33 UTC--2016-06-04 22:45:43 UTC","2016-06-04 22:45:43 UTC--2016-06-04 22:45:52 UTC",
 "2016-06-04 22:45:52 UTC--2016-06-04 22:46:01 UTC","2016-06-04 22:46:01 UTC--2016-06-04 22:46:13 UTC",
 "2016-06-04 22:46:13 UTC--2016-06-04 22:46:21 UTC","2016-06-04 22:46:21 UTC--2016-06-04 22:46:31 UTC",
 "2016-06-04 22:46:31 UTC--2016-06-04 22:46:42 UTC","2016-06-04 22:46:42 UTC--2016-06-04 22:46:53 UTC",
 "2016-06-04 22:46:53 UTC--2016-06-04 22:47:01 UTC","2016-06-04 22:47:01 UTC--2016-06-04 22:47:11 UTC",
 "2016-06-04 22:47:11 UTC--2016-06-04 22:47:21 UTC","2016-06-04 22:47:21 UTC--2016-06-04 22:47:31 UTC",
 "2016-06-04 22:47:31 UTC--2016-06-04 22:47:41 UTC","2016-06-04 22:47:41 UTC--2016-06-04 22:47:51 UTC",
 "2016-06-04 22:47:51 UTC--2016-06-04 22:48:03 UTC","2016-06-04 22:48:03 UTC--2016-06-04 22:48:13 UTC",
 "2016-06-04 22:48:13 UTC--2016-06-04 22:48:25 UTC","2016-06-04 22:48:25 UTC--2016-06-04 22:48:33 UTC",
 "2016-06-04 22:48:33 UTC--2016-06-04 22:48:43 UTC","2016-06-04 22:48:43 UTC--2016-06-04 22:48:53 UTC",
 "2016-06-04 22:48:53 UTC--2016-06-04 22:49:03 UTC","2016-06-04 22:49:03 UTC--2016-06-04 22:49:13 UTC",
 "2016-06-04 22:49:13 UTC--2016-06-04 22:49:22 UTC","2016-06-04 22:49:22 UTC--2016-06-04 22:49:33 UTC",
 "2016-06-04 22:49:33 UTC--2016-06-04 22:49:43 UTC","2016-06-04 22:49:43 UTC--2016-06-04 22:49:54 UTC",
 "2016-06-04 22:49:54 UTC--2016-06-04 22:50:02 UTC","2016-06-04 22:50:02 UTC--2016-06-04 22:50:14 UTC",
 "2016-06-04 22:50:14 UTC--2016-06-04 22:50:23 UTC","2016-06-04 22:50:23 UTC--2016-06-04 22:50:33 UTC",
 "2016-06-04 22:50:33 UTC--2016-06-04 22:50:43 UTC","2016-06-04 22:50:43 UTC--2016-06-04 22:50:52 UTC",
 "2016-06-04 22:50:52 UTC--2016-06-04 22:51:02 UTC","2016-06-04 22:51:02 UTC--2016-06-04 22:51:12 UTC",
 "2016-06-04 22:51:12 UTC--2016-06-04 22:51:24 UTC","2016-06-04 22:51:24 UTC--2016-06-04 22:51:34 UTC",
 "2016-06-04 22:51:34 UTC--2016-06-04 22:51:41 UTC","2016-06-04 22:51:41 UTC--2016-06-04 22:51:57 UTC",
 "2016-06-04 22:51:57 UTC--2016-06-04 22:52:04 UTC","2016-06-04 22:52:04 UTC--2016-06-04 22:52:14 UTC",
 "2016-06-04 22:52:14 UTC--2016-06-04 22:52:25 UTC","2016-06-04 22:52:25 UTC--2016-06-04 22:52:35 UTC",
 "2016-06-04 22:52:35 UTC--2016-06-04 22:52:43 UTC","2016-06-04 22:52:43 UTC--2016-06-04 22:52:51 UTC",
 "2016-06-04 22:52:51 UTC--2016-06-04 22:53:02 UTC","2016-06-04 22:53:02 UTC--2016-06-04 22:53:15 UTC",
 "2016-06-04 22:53:15 UTC--2016-06-04 22:53:26 UTC","2016-06-04 22:53:26 UTC--2016-06-04 22:53:32 UTC",
 "2016-06-04 22:53:32 UTC--2016-06-04 22:53:58 UTC","2016-06-04 22:53:58 UTC--2016-06-04 22:54:04 UTC",
 "2016-06-04 22:54:04 UTC--2016-06-04 22:54:14 UTC","2016-06-04 22:54:14 UTC--2016-06-04 22:54:25 UTC",
 "2016-06-04 22:54:25 UTC--2016-06-04 22:54:35 UTC","2016-06-04 22:54:35 UTC--2016-06-04 22:55:05 UTC",
 "2016-06-04 22:55:05 UTC--2016-06-04 22:55:15 UTC","2016-06-04 22:55:15 UTC--2016-06-04 22:55:26 UTC",
 "2016-06-04 22:55:26 UTC--2016-06-04 22:55:34 UTC","2016-06-04 22:55:34 UTC--2016-06-04 22:55:45 UTC",
 "2016-06-04 22:55:45 UTC--2016-06-04 22:55:55 UTC","2016-06-04 22:55:55 UTC--2016-06-04 22:56:06 UTC",
 "2016-06-04 22:56:06 UTC--2016-06-04 22:56:21 UTC","2016-06-04 22:56:21 UTC--2016-06-04 22:56:33 UTC",
 "2016-06-04 22:56:33 UTC--2016-06-04 22:56:45 UTC","2016-06-04 22:56:45 UTC--2016-06-04 23:27:57 UTC",
 "2016-06-04 23:27:57 UTC--2016-06-04 23:58:35 UTC","2016-06-04 23:58:35 UTC--2016-06-05 00:29:05 UTC",
 "2016-06-05 00:29:05 UTC--2016-06-05 01:00:03 UTC","2016-06-05 01:00:03 UTC--2016-06-05 01:00:11 UTC",
 "2016-06-05 01:00:11 UTC--2016-06-05 01:00:22 UTC","2016-06-05 01:00:22 UTC--2016-06-05 01:00:32 UTC",
 "2016-06-05 01:00:32 UTC--2016-06-05 01:00:42 UTC","2016-06-05 01:00:42 UTC--2016-06-05 01:00:51 UTC",
 "2016-06-05 01:00:51 UTC--2016-06-05 01:01:02 UTC","2016-06-05 01:01:02 UTC--2016-06-05 01:01:12 UTC",
 "2016-06-05 01:01:12 UTC--2016-06-05 01:01:21 UTC","2016-06-05 01:01:21 UTC--2016-06-05 01:01:31 UTC",
 "2016-06-05 01:01:31 UTC--2016-06-05 01:01:41 UTC","2016-06-05 01:01:41 UTC--2016-06-05 01:01:51 UTC",
 "2016-06-05 01:01:51 UTC--2016-06-05 01:02:02 UTC","2016-06-05 01:02:02 UTC--2016-06-05 01:02:12 UTC",
 "2016-06-05 01:02:12 UTC--2016-06-05 01:02:22 UTC","2016-06-05 01:02:22 UTC--2016-06-05 01:02:32 UTC",
 "2016-06-05 01:02:32 UTC--2016-06-05 01:02:42 UTC","2016-06-05 01:02:42 UTC--2016-06-05 01:02:51 UTC",
 "2016-06-05 01:02:51 UTC--2016-06-05 01:03:02 UTC","2016-06-05 01:03:02 UTC--2016-06-05 01:03:12 UTC",
 "2016-06-05 01:03:12 UTC--2016-06-05 01:03:21 UTC","2016-06-05 01:03:21 UTC--2016-06-05 01:03:31 UTC",
 "2016-06-05 01:03:31 UTC--2016-06-05 01:03:41 UTC","2016-06-05 01:03:41 UTC--2016-06-05 01:03:51 UTC",
 "2016-06-05 01:03:51 UTC--2016-06-05 01:04:01 UTC","2016-06-05 01:04:01 UTC--2016-06-05 01:04:11 UTC",
 "2016-06-05 01:04:11 UTC--2016-06-05 01:04:21 UTC","2016-06-05 01:04:21 UTC--2016-06-05 01:04:31 UTC",
 "2016-06-05 01:04:31 UTC--2016-06-05 01:04:41 UTC","2016-06-05 01:04:41 UTC--2016-06-05 01:04:52 UTC",
 "2016-06-05 01:04:52 UTC--2016-06-05 01:05:01 UTC","2016-06-05 01:05:01 UTC--2016-06-05 01:05:11 UTC",
 "2016-06-05 01:05:11 UTC--2016-06-05 01:05:21 UTC","2016-06-05 01:05:21 UTC--2016-06-05 01:05:32 UTC",
 "2016-06-05 01:05:32 UTC--2016-06-05 01:05:42 UTC","2016-06-05 01:05:42 UTC--2016-06-05 01:05:52 UTC",
 "2016-06-05 01:05:52 UTC--2016-06-05 01:06:02 UTC"),variable3=c(1:143))


Le problème c'est que je ne trouve pas de fonction qui me permettent d'associer une date et un intervalle, j'ai essayé en toute innocence avec "merge" et aussi avec le package lubridate la fonction "int_overlaps", mais ça ne marche dans aucun des 2 cas: merge ne comprend pas ce que je lui demande et int_overlaps me dit que je dois utiliser deux intervalles pour la comparaison.

Code : Tout sélectionner

>merge(df1,df2,by=intersect("timestamp","interval")
>int_overlaps(df1$timestamp,df2$interval)
Error in int_overlaps(Move_data_test$interval, Move_data_test$timestamp) :
  c(is.interval(int1), is.interval(int2)) are not all TRUE


Auriez vous des idées pour m'aider?

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

Re: Fusionner deux data.frame par une date et un interval

Messagepar Pierre-Yves Berrard » 29 Jan 2019, 11:32

Bonjour,
Avez-vous regardé du côté de l'opérateur %within% dans lubridate :

Code : Tout sélectionner

?lubridate::`%within%`
PY

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

Re: Fusionner deux data.frame par une date et un interval

Messagepar Mickael Canouil » 29 Jan 2019, 11:42

Bonjour,

voici une proposition utilisant le tidyverse et lubridate, comme suggéré par Pierre-Yves

Code : Tout sélectionner

library(tidyverse)
library(lubridate)
dta1 <- df1 %>%
  mutate(
    timestamps = ymd_hms(timestamps, tz = "UTC")
  )
dta2 <- df2 %>%
  separate(col = "interval", into = c("start", "end"), sep = "--") %>%
  mutate(
    start = ymd_hms(start, tz = "UTC"),
    end = ymd_hms(end, tz = "UTC")
  )
dta1 %>%
  as_tibble() %>%
  mutate(
    add_dta2 = map(.x = timestamps, .f = function(.x) {
      within_interval <- .x %within% interval(start = dta2[, "start"], end = dta2[, "end"])
      if (any(within_interval)) {
        out <- dta2[within_interval, ]
      } else {
        out <- as.data.frame(matrix(NA, nrow = 1, ncol = ncol(dta2), dimnames = list(NULL, colnames(dta2))))
      }
      return(out)
    })
  ) %>%
  unnest()

Image

Cordialement
Mickaël

Nicolas Moulin
Messages : 2
Enregistré le : 28 Jan 2019, 17:13

Re: Fusionner deux data.frame par une date et un interval

Messagepar Nicolas Moulin » 29 Jan 2019, 15:01

Merci, je ne connaissais pas en effet la fonction %within%. Du coup le code marche très bien et j'obtiens le jeu de données escompté, mais je ne comprend pas très bien la fonctionnalité de as_tibble et son intérêt par rapport à un data.frame classique...
Sinon comment fait on pour récupérer en sortie de la boucle les données dans un objet?

Cordialement

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

Re: Fusionner deux data.frame par une date et un interval

Messagepar Pierre-Yves Berrard » 29 Jan 2019, 16:37

Nicolas Moulin a écrit :Sinon comment fait on pour récupérer en sortie de la boucle les données dans un objet?

Il suffit d'affecter un objet :

Code : Tout sélectionner

res <-
  dta1 %>%
  ....
PY

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

Re: Fusionner deux data.frame par une date et un interval

Messagepar Mickael Canouil » 30 Jan 2019, 15:10

Nicolas Moulin a écrit :mais je ne comprend pas très bien la fonctionnalité de as_tibble et son intérêt par rapport à un data.frame classique...


https://r4ds.had.co.nz/tibbles.html
https://cran.r-project.org/web/packages ... ibble.html
Mickaël


Retourner vers « Questions en cours »

Qui est en ligne

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