【问题标题】:R: subset data by hourR:按小时的子集数据
【发布时间】:2021-10-10 10:00:34
【问题描述】:

我正在寻找一种按小时对数据进行子集化的简单方法。我只想选择特定时间范围内的观察结果,比如说在 10:00 到 12:00 之间。我想最简单的方法是为此制作一个新的数据框。

我尝试了这段代码,但它给了我一个神秘的错误消息(错误:“,”中的意外',')。另外,我认为这种方法非常复杂,会陆续给出错误消息。有没有更方便的方法来做到这一点?

New_df <- data.frame(
  Time_part =
  c("07:30", "17:20", "18:40", "19:40", "09:30", "09:40", "18:00", "16:30", "18:30", "13:50", "09:00", "12:20", "09:20", "09:00", "12:20", "20:10", "11:20", "08:10", "12:20", "13:30", "10:00", "20:40", "10:40", "12:50", "20:30", "09:30", "13:40", "10:30", "10:20", "13:00", "13:30", "10:40", "14:10", "12:40", "14:40", "16:20", "16:10", "22:40", "08:40", "13:40", "12:30", "14:20", "16:30", "15:00", "10:50", "09:40", "20:00", "12:30", "09:20", "13:10", "13:10", "08:00", "14:00", "19:30", "17:50", "16:30", "19:40", "12:40", "20:00", "07:20", "10:20", "07:30", "15:30", "20:00", "08:00", "08:50", "10:40", "12:00", "12:20", "16:30", "09:00", "20:50", "17:40", "18:50", "08:30", "13:00", "10:00", "16:20", "18:40", "19:20", "19:20", "19:40", "19:10", "11:30", "09:10", "10:10", "13:20", "15:20", "16:30", "19:30", "20:00", "09:00", "11:50", "09:00", "12:00", "13:00", "09:00", "14:10", "10:30", "13:20"))

而我应该这样做↓

New_df %>% filter(hour(full_datetime) == 9)

数据

structure(list(Date = c("2.5.2012", "2.5.2012", "2.5.2012", "2.5.2012", 
"3.5.2012", "3.5.2012", "3.5.2012", "3.5.2012", "3.5.2012", "4.5.2012", 
"4.5.2012", "5.5.2012", "5.5.2012", "5.5.2012", "5.5.2012", "5.5.2012", 
"6.5.2012", "6.5.2012", "7.5.2012", "7.5.2012", "8.5.2012", "8.5.2012", 
"8.5.2012", "8.5.2012", "8.5.2012", "9.5.2012", "9.5.2012", "9.5.2012", 
"9.5.2012", "9.5.2012", "9.5.2012", "9.5.2012", "9.5.2012", "9.5.2012", 
"9.5.2012", "9.5.2012", "9.5.2012", "9.5.2012", "10.5.2012", 
"10.5.2012", "10.5.2012", "10.5.2012", "10.5.2012", "10.5.2012", 
"11.5.2012", "11.5.2012", "11.5.2012", "12.5.2012", "12.5.2012", 
"14.5.2012", "14.5.2012", "14.5.2012", "15.5.2012", "15.5.2012", 
"15.5.2012", "15.5.2012", "15.5.2012", "16.5.2012", "16.5.2012", 
"17.5.2012", "17.5.2012", "17.5.2012", "17.5.2012", "17.5.2012", 
"18.5.2012", "18.5.2012", "18.5.2012", "18.5.2012", "18.5.2012", 
"19.5.2012", "20.5.2012", "20.5.2012", "20.5.2012", "20.5.2012", 
"21.5.2012", "21.5.2012", "21.5.2012", "21.5.2012", "21.5.2012", 
"21.5.2012", "21.5.2012", "21.5.2012", "22.5.2012", "22.5.2012", 
"22.5.2012", "22.5.2012", "22.5.2012", "22.5.2012", "22.5.2012", 
"22.5.2012", "22.5.2012", "23.5.2012", "23.5.2012", "23.5.2012", 
"23.5.2012", "23.5.2012", "23.5.2012", "23.5.2012", "23.5.2012", 
"23.5.2012"), Time = c("07:30", "17:20", "18:40", "19:40", "09:30", 
"09:40", "18:00", "16:30", "18:30", "13:50", "09:00", "12:20", 
"09:20", "09:00", "12:20", "20:10", "11:20", "08:10", "12:20", 
"13:30", "10:00", "20:40", "10:40", "12:50", "20:30", "09:30", 
"13:40", "10:30", "10:20", "13:00", "13:30", "10:40", "14:10", 
"12:40", "14:40", "16:20", "16:10", "22:40", "08:40", "13:40", 
"12:30", "14:20", "16:30", "15:00", "10:50", "09:40", "20:00", 
"12:30", "09:20", "13:10", "13:10", "08:00", "14:00", "19:30", 
"17:50", "16:30", "19:40", "12:40", "20:00", "07:20", "10:20", 
"07:30", "15:30", "20:00", "08:00", "08:50", "10:40", "12:00", 
"12:20", "16:30", "09:00", "20:50", "17:40", "18:50", "08:30", 
"13:00", "10:00", "16:20", "18:40", "19:20", "19:20", "19:40", 
"19:10", "11:30", "09:10", "10:10", "13:20", "15:20", "16:30", 
"19:30", "20:00", "09:00", "11:50", "09:00", "12:00", "13:00", 
"09:00", "14:10", "10:30", "13:20")), row.names = c(NA, -100L
), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

    标签: r tidyverse lubridate


    【解决方案1】:

    您可以为小时和分钟创建一个单独的列,然后您可以在小时数据上filter

    library(dplyr)
    library(tidyr)
    
    df %>%
      separate(Time, c('hour', 'minutes'), sep = ':', convert = TRUE) %>%
      filter(between(hour, 10, 11))
    
    #    Date       hour minutes
    #   <chr>     <int>   <int>
    # 1 6.5.2012     11      20
    # 2 8.5.2012     10       0
    # 3 8.5.2012     10      40
    # 4 9.5.2012     10      30
    # 5 9.5.2012     10      20
    # 6 9.5.2012     10      40
    # 7 11.5.2012    10      50
    # 8 17.5.2012    10      20
    # 9 18.5.2012    10      40
    #10 21.5.2012    10       0
    #11 22.5.2012    11      30
    #12 22.5.2012    10      10
    #13 23.5.2012    11      50
    #14 23.5.2012    10      30
    

    【讨论】:

    • 谢谢罗纳克。这肯定是更聪明的方法。但是您知道为什么当我将该代码应用于类似数据时会收到这些警告吗?警告信息: 1:预计 2 件。在 23344 行 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ... ]。 2: In between(hour, 10, 12) : 强制引入的 NAs
    • 在您的真实数据中,您的数据可能与您所显示的模式不同。这适用于something:something 模式。在您的实际数据中,Time 列中的前 5 个值是什么?
    • 好的,我发现如果我在您的代码df$Time &lt;- as.POSIXct(df$Time, format = "%H:%M")之前运行此代码会出现警告消息
    【解决方案2】:

    他是解决你问题的另一种方式:

    library(dplyr)
    
    df %>% 
      filter(as.integer(substr(Time, 1, 2)) %in% 10:11)
    
    # # A tibble: 14 x 2
    #    Date      Time 
    #    <chr>     <chr>
    #  1 6.5.2012  11:20
    #  2 8.5.2012  10:00
    #  3 8.5.2012  10:40
    #  4 9.5.2012  10:30
    #  5 9.5.2012  10:20
    #  6 9.5.2012  10:40
    #  7 11.5.2012 10:50
    #  8 17.5.2012 10:20
    #  9 18.5.2012 10:40
    # 10 21.5.2012 10:00
    # 11 22.5.2012 11:30
    # 12 22.5.2012 10:10
    # 13 23.5.2012 11:50
    # 14 23.5.2012 10:30
    

    【讨论】:

      【解决方案3】:

      我们可以利用parse_number的特性返回第一个数字部分,然后用%in%创建一个逻辑表达式

      library(dplyr)
      df %>%
          filter(readr::parse_number(Time) %in% 10:11)
      

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2016-11-04
        • 2018-09-23
        • 2017-02-16
        • 2018-04-13
        • 1970-01-01
        • 2020-02-28
        相关资源
        最近更新 更多