R:如何过滤每小时最小分钟数?

时间:2017-06-14 04:37:26

标签: r subset

我还是R的新手。我可以通过SQL服务器管理中的分区查询选择每小时的第一行。我在我的程序中发现了一个非常大的问题,它在R中使用sqlQuery()函数需要很长时间,并且在运行我的闪亮Web应用程序时需要更长时间。经过测试的方法是花费更少的时间来查询所有数据,并以更快的速度准备R中的数据。

所以这是我的示例数据:

                    Date Val
1    2017-06-11 04:00:02  83
2    2017-06-11 04:01:02  77
3    2017-06-11 04:03:01  78
..
4    2017-05-11 05:00:03  83
5    2017-05-11 05:01:02  95
6    2017-05-11 05:02:02  10
..
7    2017-05-11 06:01:00  29
8    2017-05-11 06:02:02  39
9    2017-05-11 06:03:03  85
10   2017-05-11 06:04:02  71
..
11   2017-05-11 07:05:02  33
12   2017-05-11 07:06:02  14
.. (many rows)
13   2017-05-12 00:01:01  20
14   2017-05-12 00:03:01  45

有时一小时内会丢失行。我的问题是如何过滤每小时的最小分钟行。

我的示例输出:

                    Date Val
1    2017-05-11 04:00:02  83
4    2017-05-11 05:00:03  83
7    2017-05-11 06:01:00  29
11   2017-05-11 07:05:02  33
13   2017-05-12 00:01:01  20

任何想法请帮忙。非常感谢你。

2 个答案:

答案 0 :(得分:1)

我将如何做。按日期排序。第二组按小时分组数据(实际上是第一层日期,然后按地板日期分组)并选取每组中的第一行。

library(dplyr)
library(data.table)
library(lubridate)

df <- setDT(df)[order(Date)]
output <- df[, .(Date = Date[1], Val = Val[1]) , 
             by = .(Group = floor_date(Date, "hour"))] 
head(output)
##                  Group                Date Val
## 1: 2017-05-11 04:00:00 2017-05-11 04:00:49  99
## 2: 2017-05-11 05:00:00 2017-05-11 05:01:13  45
## 3: 2017-05-11 06:00:00 2017-05-11 06:00:08  45
## 4: 2017-05-11 07:00:00 2017-05-11 07:00:20  64
## 5: 2017-05-11 08:00:00 2017-05-11 08:00:18  99
## 6: 2017-05-11 09:00:00 2017-05-11 09:06:25  40

我测试了这个示例数据

time_origin <- ymd_hms("2017-05-11 04:00:02")
set.seed(123)
df <- data.frame(Date = (sample(100000, size = 1000, TRUE) %>% seconds() %>%
                                  `+`(time_origin)),
                  Val = sample(99, size = 1000, TRUE)) 

答案 1 :(得分:1)

您可以使用lubridatedplyr转换日期,提取日期和小时,然后按日期过滤一小时内的最短时间。我把你的6月31日改为6月30日:)

library(dplyr)
library(lubridate)

dataset %>% 
  mutate(Date = ymd_hms(Date), dt = as_date(Date), hr = hour(Date)) %>% 
  group_by(dt, hr) %>% 
  filter(Date == min(Date)) %>% 
  ungroup() %>% 
  select(Date, Val)

                 Date   Val
               <dttm> <int>
1 2017-06-30 04:00:02    83
2 2017-05-11 05:00:03    83
3 2017-05-11 06:01:00    29
4 2017-05-11 07:05:02    33
5 2017-05-12 00:01:01    20