2016-11-07 1 views
2

J'ai un vecteur de POSIXct-données et que vous voulez calculer la différence entre les éléments consécutifs, comme cela se fait par diffDiff pour POSIXct avec des unités, comme dans difftime

par exemple:

burst <- as.POSIXct(c("2016-11-07 17:20:52","2016-11-07 16:21:52", "2016-11-07 15:21:52", "2016-11-02 17:20:52","2016-11-02 16:21:52", "2016-11-02 15:21:52")) 

conti <- as.POSIXct(c("2016-11-07 17:20:52","2016-11-06 17:20:52", "2016-11-05 17:20:52", "2016-11-04 17:20:52","2016-11-03 17:20:52", "2016-11-02 17:20:52")) 

diff(burst) 
diff(conti) 

Mon problème est que les unités ne sont pas égales. Je me souviens de la fonction difftime qui a un paramètre appelé unit mais je ne suis pas capable de construire une fonction apply pour obtenir un comportement simiral comme dans diff.

+0

Je n'ai pas compris votre question; s'il vous plaît partager un exemple de sortie que vous désirez! –

Répondre

0

Je ne suis pas sûr s'il existe un moyen d'appliquer des unités particulières avec diff pour les objets POSIXt. Dans le cas contraire, vous pouvez travailler directement avec les valeurs numériques, puis définir la classe et l'attribut units afin que vous ayez toujours un objet difftime avec un attribut units.

Par exemple, pour obtenir des différences en quelques minutes:

burst.diff = diff(as.numeric(burst))/60 
burst.diff = as.difftime(burst.diff, units="mins") 

burst.diff 
Time differences in mins 
[1] -59 -60 -7141 -59 -60 

Si vous ne se soucient pas de maintenir la classe d'objets ou d'unités, alors vous pouvez juste faire:

burst.diff = diff(as.numeric(burst))/60 

Vous pouvez empaqueter ceci en tant que fonction. Je ne sais pas si cela est la « bonne » en termes de la façon dont je l'ai manié la classe et les attributs et je serais curieux de savoir s'il y a de meilleures façons de le faire:

my_difftime = function(x, units="mins") { 

    div = c("secs"=1, "mins"=60, "hours"=3600) 

    if(is.na(match(units, names(div)))) { 
    stop('Please specify either units as either "secs", "mins", or "hours"') 
    } else { 
    x = diff(as.numeric(x))/div[match(units, names(div))] 
    as.difftime(x, units=units) 
    } 
} 

lapply(list(burst=burst, conti=conti), my_difftime, units="hours") 
$burst 
Time differences in hours 
[1] -0.9833333 -1.0000000 -119.0166667 -0.9833333 -1.0000000 

$conti 
Time differences in hours 
[1] -24 -25 -24 -24 -24