每分钟对应的最后一个值

时间:2019-03-04 13:54:15

标签: r date datetime time

我想在表“ Table”中每分钟提取一次相应的最后一个值:

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 :(得分:2)

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

答案 1 :(得分:0)

与@ 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

答案 2 :(得分:0)

以@ Grothendieck的出色答案为基础,我提供了一个整洁的解决方案。

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