2017-03-25 3 views
3

J'ai un vecteur de date avec NAs principaux et je voudrais générer une séquence approximative pour ces NA en utilisant na.approx du paquet zoo.Inverser/reculer na.approx

na.approx ne fonctionne pas pour les grandes agences nationales:

x <- as.Date(c(rep(NA,3),"1992-01-16","1992-04-16","1992-07-16", 
"1992-10-16","1993-01-15","1993-04-16","1993-07-17")) 
as.Date(na.approx(x,na.rm=FALSE)) 

[1] NA   NA   NA   "1992-01-16" "1992-04-16" 
1992-07-16" "1992-10-16" "1993-01-15" "1993-04-16" "1993-07-17" 

Je pensais que je pouvais inverser mon vecteur en utilisant rev mais je reçois encore NAs

as.Date(na.approx(rev(x),na.rm=FALSE)) 

[1] "1993-07-17" "1993-04-16" "1993-01-15" "1992-10-16" "1992-07-16" 
"1992-04-16" "1992-01-16" NA   NA   NA 

Toutes les idées?

+0

'as.Date (na.approx (x, na.rm = FALSE, règle = 2))' obtient un peu plus près, mais il semble que vous voulez pour créer une séquence en dehors de la plage? Actuallt essayez 'as.Date (na.spline (x, na.rm = FALSE))' – user20650

+0

Juste vu votre édition. Postez votre réponse 'na.spline' et je l'accepterai. Je vous remercie. –

+0

pas de problèmes .. s'il vous plaît annuler votre réponse – user20650

Répondre

1

J'ai trouvé ma réponse. na.spline fait du bon travail avec beaucoup de données. Dans l'exemple ci-dessus, j'ai quelques dates qui provoquent la dérive de l'approximation. Cependant, dans mon exemple réel, il n'y a pas de dérive.

as.Date(na.spline(x,na.rm=FALSE)) 
[1] "1993-07-17" "1993-04-16" "1993-01-15" "1992-10-16" "1992-07-16" 
"1992-04-16" "1992-01-16" "1991-10-15" "1991-07-13" "1991-04-06" 
+0

Je pense que «na.spline» est la réponse, donc cela devrait obtenir la coche (PS vous n'avez pas besoin de rev) – user20650

+1

Je ne peux pas cocher ma propre réponse pendant 48 heures. Je vais le laisser comme ça pour le moment, donc les autres utilisateurs savent que la question a été répondue. –

2

na.approx nécessite un rule à passer pour des valeurs en dehors de la valeur min ou max de votre vecteur. Si rule=2 est utilisé, les valeurs manquantes sont imputées avec la valeur la plus proche.

as.Date(na.approx(x,na.rm=FALSE, rule=2)) 
# [1] "1992-01-16" "1992-01-16" "1992-01-16" "1992-01-16" "1992-04-16" "1992-07-16" "1992-10-16" "1993-01-15" 
# [9] "1993-04-16" "1993-07-17" 

Comme alternative, vous pouvez utiliser na.spline (comme dans votre réponse). Vous mentionnez qu'il peut devenir un peu sauvage, donc vous pouvez écrire une fonction pour imputer les valeurs en fonction de la différence de temps entre vos mesures. J'utilise la première différence non manquante ici

add_leading_seq_dates <- function(x) { 
     first_non_missing = which.min(is.na(x)) 
     first_day_diff = na.omit(diff(x))[1] 
     no_of_leadng_missing = first_non_missing - 1 
     input_dates = x[first_non_missing] - cumsum(rep(first_day_diff, no_of_leadng_missing)) 
     x[is.na(x)] = rev(input_dates) 
     x 
} 

add_leading_seq_dates(x) 

# [1] "1991-04-18" "1991-07-18" "1991-10-17" "1992-01-16" "1992-04-16" 
# [6] "1992-07-16" "1992-10-16" "1993-01-15" "1993-04-16" "1993-07-17" 

diff(add_leading_seq_dates(x)) 
# Time differences in days 
# [1] 91 91 91 91 91 92 91 91 92