2017-10-21 55 views
0

Je suis en difficulté pour obtenir la valeur maximale de la variable de la dernière année d'observations (pas chaque année!) Et de l'implémenter à chaque rangée (observation). Je pense que la meilleure façon de le faire est d'utiliser la fonction rollapply mais je ne peux pas comprendre comment la largeur devrait ressembler puisqu'elle peut varier pour chaque observation (chaque observation représente un jour mais pas tous les jours ont des observations). Je sais que l'utilisation de la liste fera des valeurs de décalage alors comment ces valeurs ressemblent-elles?Calculer le maximum de l'année dernière observations

Le code que je suis:

mutate(data,"Feature"=rollapplyr(variable,list(0,"Go back one year"),max,fill=NA)) 

Exemple afin de préciser: une ligne a date de 31/8/2016. Je veux que la nouvelle colonne (en utilisant mutate du paquet dplyr) affiche dans cette rangée la valeur maximum de variable du 31/8/2015 au 31/8/2016 (cette ligne).

Pour ceux qui veulent aller plus loin: Au lieu d'afficher la valeur variable - affichage TRUE ou FALSE (ou 1/0) lorsqu'il est calculé au maximum variable est supérieure à la valeur de seuil.

+1

Il est plus probable que vous obtiendrez une bonne réponse si vous fournissez un [complet minimal exemple reproductible] (http://stackoverflow.com/help/mcve) pour aller avec votre question. Quelque chose que nous pouvons travailler et utiliser pour vous montrer comment il pourrait être possible de répondre à votre question. Cela rend également votre question et réponse plus utile pour les autres à l'avenir. –

Répondre

1

Difficile de répondre sans plus de détails. Mais si c'est ce que vous avez besoin:

data=data.frame(Data=seq.Date(as.Date("2001-01-01"),as.Date("2005-12-31"),by = "month"),Var=sample(1:1000,60,TRUE)) 
#exclude some lines 
data=data[-c(10,15,17:21),] 


# using for 
    for (i in 1:nrow(data)){ # i=1 
     data$Max[i]=max(data[data$Data>(data$Data[i]-360) & data$Data<=data$Data[i],"Var"]) 
    } 


# using rollapply 
# one year interval from dates 
    for (i in 1:nrow(data)){ # i=1 
     data$Oneyear[i]=length(data$Data[data$Data>(data$Data[i]-360) & data$Data<=data$Data[i]]) 
    } 

data$Maxr=rollapplyr(data$Var, data$Oneyear, max) 

En utilisant

set.seed(123) 

vous obtiendrez:

> tail(data) 
     Data Var Oneyear Max Maxr 
55 2005-07-01 561  12 858 858 
56 2005-08-01 207  12 858 858 
57 2005-09-01 128  12 858 858 
58 2005-10-01 754  12 858 858 
59 2005-11-01 896  12 896 896 
60 2005-12-01 375  12 896 896 
+0

Merci @Robert! était très utile! Je vous ai vu utilisé 360 jours comme année. Est-il possible d'échanger ceci avec l'année complète en fonction de la date d'observation? (Par année complète, je veux dire moins 1 dans l'année de la date alors que le jour et le mois restent les mêmes –

+0

Oui Au lieu de '(data $ Data [i] -360)' utiliser 'as.Date (coller (comme. numérique (format (données $ Données [i], "% Y")) - 1, format (données $ Données [i], "% m-% d"), sep = "-")) ' – Robert