【问题标题】:R Filtering data using reference time table in RR使用R中的参考时间表过滤数据
【发布时间】:2018-09-06 05:28:21
【问题描述】:

我有一个数据框(下面的示例),它有一个时间和两个其他变量

data<- data.frame(structure(list(datetime = c("7/17/2017 8:16:53", "7/17/2017 8:16:55", 
                            "7/17/2017 8:16:57", "7/17/2017 8:16:59", "7/17/2017 8:17:01", 
                            "7/17/2017 8:17:02", "7/17/2017 8:17:04", "7/17/2017 8:17:06", 
                            "7/17/2017 8:17:08", "7/17/2017 8:17:10", "7/17/2017 8:17:12", 
                            "7/17/2017 8:17:13", "7/17/2017 8:17:15", "7/17/2017 8:17:17", 
                            "7/17/2017 8:17:19", "7/17/2017 8:17:21", "7/17/2017 8:17:22", 
                            "7/17/2017 8:17:27", "7/17/2017 8:17:29", NA, NA), var1 = c(252.234873, 
                                                                                        254.0436836, 252.5279108, 252.4802478, 252.6377229, 253.8766496, 
                                                                                        249.8086397, 249.5646219, 249.1815691, 253.9509387, 251.7245156, 
                                                                                  251.8415925, 254.2059507, 253.9145112, 251.8415925, 254.2059507, 
                                                                                        253.9145112, 252.4802478, 252.6377229, NA, NA), var2 = c(582.5766695, 
                                                                                                                                                 583.0972735, 582.7872586, 582.312636, 579.6445667, 579.7995196, 
                                                                                                                                                 578.9574528, 576.5341483, 575.8460797, 574.2353493, 574.8998519, 
                                                                                                                                                 574.1717159, 573.8133058, 574.6849578, 574.1717159, 573.8133058, 
                                                                                                                                                 574.6849578, 582.312636, 579.6445667, NA, NA)), .Names = c("datetime", 
                                                                                                                                                                                                            "var1", "var2"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
                                                                                                                                                                                                                                                                                     -21L), spec = structure(list(cols = structure(list(datetime = structure(list(), class = c("collector_character", 
                                                                                                                                                                                                                                                                                                                                                                               "collector")), var1 = structure(list(), class = c("collector_double", 
                                                                                                                                                                                                                                                                                                                                                                                                                                 "collector")), var2 = structure(list(), class = c("collector_double", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   "collector"))), .Names = c("datetime", "var1", "var2")), default = structure(list(), class = c("collector_guess", 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  "collector"))), .Names = c("cols", "default"), class = "col_spec")))

我想根据时间变量将我的数据过滤到不同的时期。我已经列出了 From 和 To 之间的时间段,如下例所示

tab_filt <- data.frame(structure(list(From = c("7/17/2017 8:16:53", "7/17/2017 8:17:04", 
                                               "7/17/2017 8:17:19"), To = c("7/17/2017 8:16:59", "7/17/2017 8:17:10", 
                                                                            "7/17/2017 8:17:27")), .Names = c("From", "To"), class = c("tbl_df", 
                                                                                                                                       "tbl", "data.frame"), row.names = c(NA, -3L), spec = structure(list(
                                                                                                                                         cols = structure(list(From = structure(list(), class = c("collector_character", 
                                                                                                                                                                                                  "collector")), To = structure(list(), class = c("collector_character", 
                                                                                                                                                                                                                                                  "collector"))), .Names = c("From", "To")), default = structure(list(), class = c("collector_guess", 
                                                                                                                                                                                                                                                                                                                                   "collector"))), .Names = c("cols", "default"), class = "col_spec")))

为了方便您的帮助,我还将时间转换为 Posixct 用于示例数据

data$datetime <- as.POSIXct(strptime(data$datetime, format="%m/%d/%Y %H:%M:%S"))
tab_filt$From <- as.POSIXct(strptime(tab_filt$From, format="%m/%d/%Y %H:%M:%S"))
tab_filt$To <- as.POSIXct(strptime(tab_filt$To, format="%m/%d/%Y %H:%M:%S"))

我想知道如何仅针对第二个表中的期间过滤我的数据。 请帮忙

如果您需要任何其他详细信息,请告诉我 :)

【问题讨论】:

    标签: r filter time-series lubridate


    【解决方案1】:

    首先,我必须感谢 OP 添加示例数据和相关命令以转换为日期字段。

    可以使用data.tabledatatab_filt 连接起来,以过滤在tab_filt 中定义的FromTo 范围内的数据:

    library(data.table)
    setDT(data)
    setDT(tab_filt)
    
    data[tab_filt, .(x.datetime,x.var1,x.var2), on=.(datetime <= To, datetime >= From)]
    #             x.datetime  x.var1   x.var2
    # 1: 2017-07-17 08:16:53 252.2349 582.5767
    # 2: 2017-07-17 08:16:55 254.0437 583.0973
    # 3: 2017-07-17 08:16:57 252.5279 582.7873
    # 4: 2017-07-17 08:16:59 252.4802 582.3126
    # 5: 2017-07-17 08:17:04 249.8086 578.9575
    # 6: 2017-07-17 08:17:06 249.5646 576.5341
    # 7: 2017-07-17 08:17:08 249.1816 575.8461
    # 8: 2017-07-17 08:17:10 253.9509 574.2353
    # 9: 2017-07-17 08:17:19 251.8416 574.1717
    # 10: 2017-07-17 08:17:21 254.2060 573.8133
    # 11: 2017-07-17 08:17:22 253.9145 574.6850
    # 12: 2017-07-17 08:17:27 252.4802 582.3126
    

    【讨论】:

    • 非常感谢。它适用于过滤变量。但是,在结果的日期时间列中显示相同时间段的相同时间。但无论如何感谢您的努力。我了解了有关 data.table 的更多信息 :)
    • @KathiravanMeeran 抱歉,我忽略了它。我已更新答案以处理您的反馈。
    • 感谢您的快速回复和答复。效果很好
    【解决方案2】:

    这是使用包lubridate的简洁方法:

    library(lubridate)
    library(dplyr)
    
    # create intervals using %--%
    ints <- tab_filt$From %--% tab_filt$To
    
    # check for each row if datetime lies in any of the intervals using %within%
    data %>% 
      rowwise() %>%
      mutate(In = any(datetime %within% ints))
    

    这会导致

    # A tibble: 21 x 4
       datetime             var1  var2 In   
       <dttm>              <dbl> <dbl> <lgl>
     1 2017-07-17 08:16:53  252.  583. TRUE 
     2 2017-07-17 08:16:55  254.  583. TRUE 
     3 2017-07-17 08:16:57  253.  583. TRUE 
     4 2017-07-17 08:16:59  252.  582. TRUE 
     5 2017-07-17 08:17:01  253.  580. FALSE
     6 2017-07-17 08:17:02  254.  580. FALSE
     7 2017-07-17 08:17:04  250.  579. TRUE 
     8 2017-07-17 08:17:06  250.  577. TRUE 
     9 2017-07-17 08:17:08  249.  576. TRUE 
    10 2017-07-17 08:17:10  254.  574. TRUE 
    # ... with 11 more rows
    

    其中In = FALSE 表示应删除这些行。为此,只需在上面的管道中添加%&gt;% filter(In)

    【讨论】:

    • 太棒了.. 谢谢.. 成功了.. 我非常喜欢标记 TRUE 和 FALSE 的想法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多