Обработка пропущенных значений во временных рядах в r - PullRequest
2 голосов
/ 20 июня 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 и 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(A1:A5)
5.1  02/02/2018 07:46:01        mean(A1:A5)  mean(B1:B5)         mean(C1:C5)
5.2  02/02/2018 07:46:02        mean(A1:A5)  mean(B1:B5)         mean(C1:C5) 
5.3  02/02/2018 07:46:03        mean(A1:A5)  mean(B1:B5)         mean(C1:C5) 
5.4  02/02/2018 07:46:04        mean(A1:A5)  mean(B1:B5)         mean(C1:C5)
5.5  02/02/2018 07:46:05        mean(A1:A5)  mean(B1:B5)         mean(C1:C5)
5.6  02/02/2018 07:46:06        mean(A1:A5)  mean(B1:B5)         mean(C1:C5)
5.7  02/02/2018 07:46:07        mean(A1:A5)  mean(B1:B5)         mean(C1:C5)
5.8  02/02/2018 07:46:08        mean(A1:A5)  mean(B1:B5)         mean(C1:C5)
5.9  02/02/2018 07:46:09        mean(A1:A5)  mean(B1:B5)         mean(C1:C5)
6   02/02/2018 07:46:10         112         2323            2323
6.1 02/02/2018 07:46:11         mean(A1:A15) mean(B1:B15)       mean(C1:C15)

Или даже это может быть среднее значение предыдущих строк за это времяинтервал.

 6.1 02/02/2018 07:46:11         mean(A14:A17) mean(B14:B17)      mean(C14:C17)

Т.е. отсутствует, кроме пропущенных значений времени.

Я сделал следующий код, чтобы получить среднее значение для целого столбца.

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())

Это дает вывод для всехсреднее значение для всех строк в столбце.

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

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Для этой цели сделан очень интуитивно понятный пакет, называемый «падр». Я думаю, вы найдете, что он служит вашим потребностям: кран виньетка падр

1 голос
/ 20 июня 2019

Вот комбинация tidyverse и базовый метод R для достижения результата. Сначала мы создаем новый столбец с совокупными средними значениями для каждого столбца. Затем мы complete пропустили наблюдения и заменили NA соответствующими значениями из других столбцов.

library(tidyverse)
cols <- c("A", "B", "C")

df1 <- df %>%
        mutate_at(cols, list(mean = ~cummean(.))) %>%
        complete(Time_Stamp = seq(min(Time_Stamp), max(Time_Stamp), by = "sec")) %>%
        fill(ends_with("mean")) %>%
        mutate(ID = row_number())

mean_cols <- grep("_mean$", names(df1))
df1[cols] <- Map(function(x, y) ifelse(is.na(x), y, x), df1[cols], df1[mean_cols])

df1[names(df)]

#     ID Time_Stamp              A     B     C
#   <int> <dttm>              <dbl> <dbl> <dbl>
# 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:03  197   256.  218 
# 5     5 2018-02-02 07:45:04  197   256.  218 
# 6     6 2018-02-02 07:45:05  197   256.  218 
# 7     7 2018-02-02 07:45:06  197   256.  218 
# 8     8 2018-02-02 07:45:07  197   256.  218 
# 9     9 2018-02-02 07:45:08  197   256.  218 
#10    10 2018-02-02 07:45:09  197   256.  218 
#11    11 2018-02-02 07:45:10  112  2323  2323 
#12    12 2018-02-02 07:45:11  176.  772.  744.
#13    13 2018-02-02 07:45:12  176.  772.  744.
#14    14 2018-02-02 07:45:13  176.  772.  744.
#15    15 2018-02-02 07:45:14  176.  772.  744.
#16    16 2018-02-02 07:45:15  100    23    12 

Если вам нужно скользящее среднее для каждого значения NA, оно становится немного проще

df %>%
  complete(Time_Stamp = seq(min(Time_Stamp), max(Time_Stamp), by = "sec")) %>%
  mutate_at(cols, ~ifelse(is.na(.), cummean(na.omit(.)), .)) %>%
  mutate(ID = row_number())

Данные

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

который выглядит как

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
#5  5 2018-02-02 07:45:15 100   23   12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...