ресэмплировать временной ряд данных и использовать предыдущее значение для переменных в R - PullRequest
0 голосов
/ 04 мая 2020

Я хочу объединить два кадра данных с разными временными метками. Данные поступают из двух разных сигналов с разной частотой. Кадры данных выглядят следующим образом

df1 = data.frame(time = c(0.12, 0.21, 0.33, 0.42), 
             var1 = c(1, NA, 4, 6),
             var2 = c(4, 3, NA, 2))

df2 = data.frame(time = c(0.04, 0.08, 0.1, 0.12),
             var3 = c(2, 7, 5, 9))

Как объединить эти два кадра данных только с одной частотой? Столбец времени должен выглядеть следующим образом:

time = c(0.01, 0.02, 0.03, 0.04)

et c.

Как мне изменить выборку моих данных, чтобы всегда использовалось предыдущее значение того же столбца? Результат выглядит следующим образом.

dfRes  = data.frame(time = c(0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 
                             0.09, 0.1, 0.11, 0.12, 0.13),
             var1 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
             var2 = c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4),
             var3 = c(2, 2, 2, 2, 2, 2, 2, 7, 7, 5, 5, 9, 9))

Я думаю, что dfRes $ var3 показывает идею, стоящую за этим.

Мне нужно это для некоторых графиков и алгоритмов машинного обучения в более позднем процессе. Поэтому я не знаю, имеет ли смысл использовать формат временных рядов.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Базовое решение R

inds <- which(is.na(df),arr.ind = TRUE)
df[inds] <- df[cbind(inds[,"row"]-1,inds[,"col"])]
df$time <- floor(10*df$time)/10

, которое дает

> df
  time var1 var2
1  0.1    1    4
2  0.2    1    5
3  0.3    4    5
4  0.4    2    3
5  0.5    6    2
6  0.6    6    1
1 голос
/ 04 мая 2020

Мы можем использовать fill

library(dplyr)
library(tidyr)
df %>%
     mutate(time = as.numeric(substr(time, 1, 3)) %>%
     fill(var1, var2)
...