【问题标题】:Corresponding last value in every minute每分钟对应的最后一个值
【发布时间】:2019-07-25 20:28:10
【问题描述】:

我想在表格“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 值,但无法继续。

【问题讨论】:

    标签: r date datetime time


    【解决方案1】:

    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) 子集 另一种方法是,根据您想要的输出,将时间截断为分钟,然后从末尾向后删除那些存在重复截断时间的行。 p>

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

    【讨论】:

    • 我使用了“子集”,因为我也可以提取其他相应列的信息
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      基于 @ Grothendieck 的出色回答,我提供了一个 tidyverse 解决方案。

      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 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多