J'ai un ensemble de données avec des valeurs appariées que j'ai converties en un bloc de données comme celui-ci :

(50.0, 0.0), (49, 27.891), (48, 28.119), 
(47, 28.146), (46, 28.158), (45, 28.195), 
(44, 28.261), (43, 28.274), (42, 28.316), 
(41, 28.326), (40, 28.608), (39, 28.687), 
(38, 28.736), (37, 28.746)

numeric_data
   clean_time_numeric clean_position_numeric
1               0.000                     50
2              27.891                     49
3              28.119                     48
4              28.146                     47
5              28.158                     46

Cette trame de données a des points temporels et la position d'un curseur à ce moment-là. Je veux faire une série temporelle avec des intervalles de 0,001 avec la position correspondante du curseur dans la colonne suivante, donc la position serait de 50 jusqu'à la 27 891e ligne.

J'ai essayé ce morceau de code avec les packages xts et zoo que j'ai vu dans un autre post :

df1.zoo <- zoo(clean_time_numeric)
df2 <- as.data.frame(as.zoo(merge(as.xts(df1.zoo), as.xts(zoo(,seq(start(df1.zoo[1]),end(df1.zoo[89]), order.by = as.POSIXct.numeric(clean_time_numeric, tryformats = "%Y%m%d%H%M%S")))))))

Mais cette erreur persiste :

Error in xts(coredata(x), order.by = order.by, frequency = frequency,  : 
  order.by requires an appropriate time-based object

Je suis nouveau dans le codage en R, donc je ne sais pas vraiment comment aborder cela ou s'il existe un moyen plus simple de résoudre ce problème, toutes les suggestions sont les bienvenues !

Merci,

Edit: j'ai aussi essayé ceci:

numeric_data$clean_time_numeric<- as.POSIXct.numeric(numeric_data$clean_time_numeric, tz= "GMT", origin = "1970-01-01", tryformats = "%H:%M:%S")

tseries <- data.frame(x = seq(head(numeric_data$clean_time_numeric,1),tail(numeric_data$clean_time_numeric,1),by = "sec"))

res <-merge(tseries, numeric_data, by.x="x",by.y="clean_time_numeric",all.x = TRUE)

xts(res$clean_position_numeric,order.by = res$x)

Avec cela, seul le premier point de données est correct - le reste est NA et il s'arrête bien avant la fin

0
Areeba Qureshi 20 mars 2021 à 22:18

2 réponses

Meilleure réponse

Une solution possible:

  1. créer une séquence avec un intervalle de 0,001
  2. joindre cette séquence à la trame de données d'origine
  3. utilisez zoo::na.locf pour remplacer NA par la dernière valeur connue
df <- read.table(text = "
          clean_time_numeric clean_position_numeric
               0.000                     50
              27.891                     49
              28.119                     48
              28.146                     47
              28.158                     46",header=T)

time.001 <- data.frame(time = seq(min(df$clean_time_numeric), max(df$clean_time_numeric), by =0.001))

library(dplyr)
df.001 <- dplyr::full_join(df, time.001, by = c("clean_time_numeric"="time")) %>% 
       arrange(clean_time_numeric) %>%
       mutate(clean_position_numeric = zoo::na.locf(clean_position_numeric))

head(df.001)
  clean_time_numeric clean_position_numeric
1              0.000                     50
2              0.001                     50
3              0.002                     50
4              0.003                     50
5              0.004                     50
6              0.005                     50

tail(df.001)
      clean_time_numeric clean_position_numeric
28155             28.153                     47
28156             28.154                     47
28157             28.155                     47
28158             28.156                     47
28159             28.157                     47
28160             28.158                     46
1
Waldi 20 mars 2021 à 19:45

À l'aide du bloc de données numeric_data affiché de manière reproductible dans la note à la fin, convertissez-le en une série de zoos à l'aide de read.zoo. Définissez ensuite sa fréquence sur 1000 (c'est le nombre de points par unité d'intervalle), convertissez-la en classe ts et utilisez na.locf0 (ou na.approx pour l'interpolation linéaire ou na.spline pour l'interpolation spline) pour remplissez les NA qui ont été créées par la conversion de zoo en ts.

library(zoo)

z <- read.zoo(numeric_data)
frequency(z) <- 1000
tt <- na.locf0(as.ts(z))

length(tt)
## [1] 28159
deltat(tt)
## [1] 0.001
range(time(tt))
## [1]  0.000 28.158

Nous pouvons maintenant

  1. laissez-le comme objet ts, tt, ou
  2. convertissez-le en série zoo : as.zoo(tt), ou
  3. convertissez-le en un bloc de données : fortify.zoo(tt)

Remarque

L'entrée sous forme reproductible:

numeric_data <- 
structure(list(clean_time_numeric = c(0, 27.891, 28.119, 28.146, 
28.158), clean_position_numeric = 50:46), class = "data.frame", row.names = c(NA, -5L))
0
G. Grothendieck 20 mars 2021 à 21:34