Соответствующее последнее значение в каждой минуте - PullRequest
0 голосов
/ 04 марта 2019

Я хочу извлечь соответствующее последнее значение в каждую минуту, скажем, в таблице «Таблица»:

Value   Time
1     5/1/2018 15:50:57
5     5/1/2018 15:50:58
21    5/1/2018 15:51:48
22    5/1/2018 15:51:49
5     5/1/2018 15:52:58
8     5/1/2018 15:52:59
71    5/1/2018 15:53:45
33    5/1/2018 15:53:50

Мне нужно соответствующее последнее «Значение» в конце каждой минуты в «Время»,То есть:

Я хочу, чтобы выходные значения были: 5, 22, 8, 33

Я пытался использовать "as.POSIXct", чтобы найти значение Table$Timeно я не могу продолжить.

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Очень похоже на @ G.Grothendieck, но вместо этого используется format, то есть

aggregate(Value ~ format(Time, '%Y-%m-%d %H:%M:00'), df, tail, 1)

#  format(Time, "%Y-%m-%d %H:%M:00") Value
#1               2018-05-01 15:50:00     5
#2               2018-05-01 15:51:00    22
#3               2018-05-01 15:52:00     8
#4               2018-05-01 15:53:00    33
0 голосов
/ 04 марта 2019

Опираясь на замечательный ответ @ Гротендика, я даю решение по тививеру.

library(dplyr)
Lines <- "
Value Time 
1 5/1/2018 15:50:57 
5 5/1/2018 15:50:58 
21 5/1/2018 16:51:48 
22 5/1/2018 16:51:49 
5 5/1/2018 17:52:58 
8 5/1/2018 17:52:59 
71 5/1/2018 18:53:45 
33 5/1/2018 18:53:50"
Lines2 <- sub(" ", ",", readLines(textConnection(Lines)))
DF <- read.csv(text = Lines2) %>% tibble::as_tibble()

# after creating reproducible data set. Set Time to date-time format
# then floor the time to nearest minute
DF %>% 
  dplyr::mutate(Time = lubridate::dmy_hms(Time),
                minute = lubridate::floor_date(Time, "minute")) %>% 
# Group by minute
  dplyr::group_by(minute) %>% 

# arrange by time
  dplyr::arrange(Time) %>% 

# extract the last row in each group
  dplyr::filter(dplyr::row_number() == n())   

Вывод

# A tibble: 4 x 3
# Groups:   min [4]
  Value Time                min                
  <int> <dttm>              <dttm>             
1     5 2018-01-05 15:50:58 2018-01-05 15:50:00
2    22 2018-01-05 16:51:49 2018-01-05 16:51:00
3     8 2018-01-05 17:52:59 2018-01-05 17:52:00
4    33 2018-01-05 18:53:50 2018-01-05 18:53:00 
0 голосов
/ 04 марта 2019

1) агрегат Используя DF, воспроизводимый в примечании в конце, усекайте каждый раз до минуты, а затем агрегируйте на основе этого:

aggregate(Value ~ Minute, transform(DF, Minute = trunc(Time, "min")), tail, 1)

, давая:

               Minute Value
1 2018-05-01 15:59:00     5
2 2018-05-01 16:59:00    22
3 2018-05-01 17:59:00     8
4 2018-05-01 18:59:00    33

2) subset Альтернативой, в зависимости от того, какой вывод вы хотите, является усечение времен до минут и затем удаление тех строк, для которых есть дублированные усеченные времена, идущие в обратном направлении отконец.

subset(DF, !duplicated(trunc(Time, "min"), fromLast = TRUE))

, дающий:

  Value                Time
2     5 2018-05-01 15:59:58
4    22 2018-05-01 16:59:49
6     8 2018-05-01 17:59:59
8    33 2018-05-01 18:59:50

Примечание

Мы предполагаем, что следующий вход показан воспроизводимо.Обратите внимание, что мы преобразовали столбец Time в класс POSIXct.

Lines <- "
Value Time 
1 5/1/2018 15:59:57 
5 5/1/2018 15:59:58 
21 5/1/2018 16:59:48 
22 5/1/2018 16:59:49 
5 5/1/2018 17:59:58 
8 5/1/2018 17:59:59 
71 5/1/2018 18:59:45 
33 5/1/2018 18:59:50"
Lines2 <- sub(" ", ",", trimws(readLines(textConnection(Lines))))
DF <- read.csv(text = Lines2)
DF$Time <- as.POSIXct(DF$Time, format = "%m/%d/%Y %H:%M:%S")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...