Обработка пропущенных значений во временных рядах - PullRequest
4 голосов
/ 14 мая 2019

Я имею дело с данными временных рядов, где мне нужны непрерывные метки времени, но при захвате было пропущено несколько точек временных меток данных, как показано ниже:

DF

ID Time_Stamp             A           B                 C
1  02/02/2018 07:45:00   123          567               434     
2   02/02/2018 07:45:01    
.....                  ...

5   02/02/2018 07:46:00   
6   02/02/2018 07:46:10    112          2323            2323

Как показано в примере df выше, отметки времени непрерывны до row 5, но пропущены данные захвата 10 seconds между 5th and 6th row.Мой фрейм данных о 60000 rows, и ручная идентификация пропущенных значений утомительна.Поэтому я искал автоматизированную процедуру обработки пропущенных значений, используя R

Мой фрейм данных результата такой, как показано ниже,

ID Time_Stamp                     A           B                 C
1  02/02/2018 07:45:00           123          567               434     
2   02/02/2018 07:45:01    
.....                  ...

5   02/02/2018 07:46:00         mean(A)
5.1  02/02/2018 07:46:01        mean(A)     mean(b)         mean(c)
5.2  02/02/2018 07:46:02        mean(A)     mean(b)         mean(c) 
5.3  02/02/2018 07:46:03        mean(A)     mean(b)         mean(c) 
5.4  02/02/2018 07:46:04        mean(A)     mean(b)         mean(c)
5.5  02/02/2018 07:46:05        mean(A)     mean(b)         mean(c)
5.6  02/02/2018 07:46:06        mean(A)     mean(b)         mean(c)
5.7  02/02/2018 07:46:07        mean(A)     mean(b)         mean(c)
5.8  02/02/2018 07:46:08        mean(A)     mean(b)         mean(c)
5.9  02/02/2018 07:46:09        mean(A)     mean(b)         mean(c)
6   02/02/2018 07:46:10         112         2323            2323

Пожалуйста, помогите!

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Всегда лучше иметь конкретный пример, показывающий конкретный ожидаемый результат, чтобы было мало места для двусмысленности и предположения. Тем не менее, я создал фиктивные данные на основе своего понимания и попытался решить их соответствующим образом.

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

Мы можем достичь этого, используя complete, генерируя последовательность для каждой секунды между min и max Time_Stamp и заполняя пропущенные значения на mean в соответствующем столбце. ID выглядит как уникальный идентификатор для каждой строки, поэтому заполнил ее row_number().

library(dplyr)
library(tidyr)

df %>%
  complete(Time_Stamp = seq(min(Time_Stamp), max(Time_Stamp), by = "sec")) %>%
  mutate_at(vars(A:C), ~replace(., is.na(.), mean(., na.rm = TRUE))) %>%
  mutate(ID = row_number()) 


# A tibble: 11 x 5
#   Time_Stamp             ID     A     B     C
#   <dttm>              <int> <dbl> <dbl> <dbl>
# 1 2018-02-02 07:45:00     1  123   567   434 
# 2 2018-02-02 07:45:01     2  234   100   110 
# 3 2018-02-02 07:45:02     3  234   100   110 
# 4 2018-02-02 07:45:03     4  176.  772.  744.
# 5 2018-02-02 07:45:04     5  176.  772.  744.
# 6 2018-02-02 07:45:05     6  176.  772.  744.
# 7 2018-02-02 07:45:06     7  176.  772.  744.
# 8 2018-02-02 07:45:07     8  176.  772.  744.
# 9 2018-02-02 07:45:08     9  176.  772.  744.
#10 2018-02-02 07:45:09    10  176.  772.  744.
#11 2018-02-02 07:45:10    11  112  2323  2323 

Если вы проверите значение столбца для последних 3 столбцов, вы увидите, что эти значения точно заменены.

colMeans(df[3:5])
#     A      B      C 
#175.75 772.50 744.25 

Данные

df <- structure(list(ID = 1:4, Time_Stamp = structure(c(1517557500, 
1517557501, 1517557502, 1517557510), class = c("POSIXct", "POSIXt"
), tzone = "UTC"), A = c(123L, 234L, 234L, 112L), B = c(567L, 
100L, 100L, 2323L), C = c(434L, 110L, 110L, 2323L)), class = "data.frame", 
row.names = c(NA, -4L))

выглядит как

df

#  ID          Time_Stamp   A    B    C
#1  1 2018-02-02 07:45:00 123  567  434
#2  2 2018-02-02 07:45:01 234  100  110
#3  3 2018-02-02 07:45:02 234  100  110
#4  4 2018-02-02 07:45:10 112 2323 2323
0 голосов
/ 14 мая 2019

Есть несколько вещей, которые можно сказать о вашей проблеме:

  • С научной точки зрения, есть ли мотивация для замены пропущенных значений, которые имеют значение), на средние значения?
  • Технически, это можно сделать с помощью функции *apply() (например, lapply очень хорошо подходит для фреймов данных)
  • О сообществе R, это может быть повторяющийся вопрос.Вы проверяли другие посты в других местах?Как это или , что , которое может помочь или дать подсказки.Я надеюсь, что мой ответ поможет вам.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...