Фильтрация столбцов из временных рядов на основе уникальных дат начала и окончания [R] (чтобы стандартизировать строку 1 как первый день для каждого) - PullRequest
1 голос
/ 02 февраля 2020

Я пытаюсь стандартизировать даты начала для столбцов в таблице timeseries, чтобы каждая из них начиналась на основе предопределенных значений, которые у меня есть в другой таблице StartEnd. datetime в timeseries в формате POSIXct, как и все значения даты в этой проблеме.

Как создать фрейм данных, в котором первая строка каждого столбца начинается со значения в Start, а также при удалении 0 значений в End? Это после распространения () по набору данных:

timeseries <- spread(timeseries, ID, Count , fill = "0")

Я посмотрел на фильтры, но я не уверен, что dplyr будет go -to Вот. Я думаю, что какая-то функция могла бы сработать, но, обладая ограниченными знаниями, я не знаю, как будет выглядеть ее структура в этом контексте. Jfyi Я самоучка в R без формального образования в области кодирования, кроме некоторых курсов Coursera.

timeseries:

    datetime          ID1 ID2 ID3 ID4 ID5 ID6 ID7
1   01/01/19 00:00:00   0   0   7   1   1   0   0
2   01/01/19 01:00:00   0   0   11  2   2   0   0
3   01/01/19 02:00:00   0   0   6   3   3   0   0
4   01/01/19 03:00:00   3   0   10  0   4   0   0
5   01/01/19 04:00:00   4   0   3   0   5   0   0
6   01/01/19 06:00:00   5   1   1   0   6   0   1
7   01/01/19 07:00:00   6   2   1   0   7   0   3
8   01/01/19 09:00:00   0   3   2   0   0   1   0
9   01/01/19 10:00:00   1   4   3   0   0   2   1

StartEnd:

SomeID   Start              End
ID1      01/01/19 03:00:00  01/01/19 10:00:00 
ID2      01/01/19 06:00:00  01/01/19 10:00:00
ID3      01/01/19 00:00:00  01/01/19 10:00:00 
ID4      01/01/19 00:00:00  01/01/19 02:00:00
ID5      01/01/19 00:00:00  01/01/19 07:00:00
ID6      01/01/19 09:00:00  01/01/19 10:00:00
ID7      01/01/19 06:00:00  01/01/19 10:00:00

Ожидаемый результат:

    ID1 ID2 ID3 ID4 ID5 ID6 ID7
1   3   1   7   1   1   1   1
2   4   2   11  2   2   2   3
3   5   3   6   3   3       0
4   6   4   10      4       1
5   0       3       5       
6   1       1       6       
7           1       7       
8           2               
9           3               

1 Ответ

0 голосов
/ 03 февраля 2020

Мы можем получить timeseries в длинном формате, объединить его с StartEnd фреймом данных, преобразовать столбцы даты и времени в POSIXct формат, filter значения, которые находятся между Start и End, и получить данные в широкий формат.

library(dplyr)
library(tidyr)

timeseries %>%
  pivot_longer(cols = -datetime, names_to = 'SomeID') %>%
  left_join(StartEnd, by = 'SomeID') %>%
  mutate_at(vars(datetime, Start, End), lubridate::dmy_hms) %>%
  filter(datetime >= Start & datetime <= End) %>%
  select(SomeID, value) %>%
  group_by(SomeID) %>%
  mutate(row = row_number()) %>%
  pivot_wider(names_from = SomeID, values_from = value) %>%
  select(-row) %>%
  select(paste0("ID", 1:7))

# A tibble: 9 x 7
#    ID1   ID2   ID3   ID4   ID5   ID6   ID7
#  <int> <int> <int> <int> <int> <int> <int>
#1     3     1     7     1     1     1     1
#2     4     2    11     2     2     2     3
#3     5     3     6     3     3    NA     0
#4     6     4    10    NA     4    NA     1
#5     0    NA     3    NA     5    NA    NA
#6     1    NA     1    NA     6    NA    NA
#7    NA    NA     1    NA     7    NA    NA
#8    NA    NA     2    NA    NA    NA    NA
#9    NA    NA     3    NA    NA    NA    NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...