Rechercher des valeurs avec une condition sur la date

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

Christian Vayssier
Messages : 44
Enregistré le : 11 Mai 2009, 08:44

Rechercher des valeurs avec une condition sur la date

Messagepar Christian Vayssier » 10 Jan 2016, 20:45

Bonjour,

Je voudrais récupérer les tailles d'une espèces à 07 et 15 jours avant la dernière valeur relevé. Le problème est que la date est différente pour chaque produit.
Voici un petit exemple d'illustration :

Ma table se présente ainsi :

ID - diamètre - date de mesure
001 - 60 - 31/12/2015
001 - 58 - 30/12/2015
001 - 54 - 29/12/2015
---------------------------
001 - 54 - 24/12/2015
001 - 50 - 16/12/2015

002 - 100 - 21/12/2015
002 - 95 - 20/12/2015
002 - 91 - 19/12/2015
---------------------------
002 - 80 - 12/12/2015
002 - 75 - 04/12/2015

003 - 65 - 25/12/2015
003 - 60 - 24/12/2015
003 - 60 - 23/12/2015
---------------------------
003 - 57 - 18/12/2015
003 - 53 - 10/12/2015

Je voudrais avoir pour chaque ID, la dernière valeur (et la date), la valeur et la date à (date de dernière valeur - 7 jours) et la valeur et la date à (date de dernière valeur - 15 jours)

Comment peut on aboutir à ce résultat ?

ID - diametre_15_jours - date - diametre_7_jours - date - diametre_actuel - date
001 - 50 - 16/12/2015 - 54 - 24/12/2015 - 60 - 31/12/2015
002 - 75 - 04/12/2015 - 80 - 12/12/2015 - 100 - 21/12/2015
003 - 53 - 10/12/2015 - 57 - 18/12/2015 - 65 - 25/12/2015

Merci pour l'aide apporter.

Cordialement,

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

Re: Rechercher des valeurs avec une condition sur la date

Messagepar Mickael Canouil » 11 Jan 2016, 09:35

Bonjour,

voici une proposition (probablement pas optimale)

Code : Tout sélectionner

dta <- read.table(text = "ID diametre date
001 60 31/12/2015
001 58 30/12/2015
001 54 29/12/2015
001 54 24/12/2015
001 50 16/12/2015
002 100 21/12/2015
002 95 20/12/2015
002 91 19/12/2015
002 80 12/12/2015
002 75 04/12/2015
003 65 25/12/2015
003 60 24/12/2015
003 60 23/12/2015
003 57 18/12/2015
003 53 10/12/2015", header = TRUE)
dta[, "date"] <- as.Date(dta[, "date"], "%d/%m/%Y")

results <- do.call("rbind", by(dta, dta[, "ID"], function (idta) {
    keydate <- sort(max(idta[, "date"])-c(0, 7, 15))
    xx <- findInterval(x = idta[, "date"], vec = keydate, rightmost.closed = TRUE)
    if (length(unique(xx))<3) {
        xx <- findInterval(x = idta[, "date"], vec = keydate, rightmost.closed = FALSE)
        out <- cbind(unique(idta[, "ID"]), do.call("cbind", by(idta, xx, function (jdta) {
            return(jdta[which.min(jdta[, "date"]), -1])
        })))
    } else {
        out <- cbind(unique(idta[, "ID"]), do.call("cbind", by(idta, xx, function (jdta) {
            return(jdta[which.max(jdta[, "date"]), -1])
        })))
    }
    colnames(out) <- c("ID", "diametre_0j", "date0j", "diametre_7j", "date7j", "diametre_15j", "date15j")
    return(out)
}))
Mickaël
mickael.canouil.fr | rlille.fr

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: Rechercher des valeurs avec une condition sur la date

Messagepar Gabriel Terraz » 11 Jan 2016, 12:23

Salut,
Voici une proposition :


Code : Tout sélectionner

f <- function(x , difference){
 x <- x[match(x$date[1] - difference , x$date), ]
 colnames(x) <- paste(colnames(x) , difference , sep="_")
 x}


l <- lapply(c(0,7,15) , function(i) do.call(rbind , by(dta , dta$ID , f , i )))
data.frame(ID = unique(dta$ID) , do.call(cbind , lapply(l , "[" , -1)))


Retourner vers « Questions en cours »

Qui est en ligne

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