我还是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
任何想法请帮忙。非常感谢你。
答案 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)
您可以使用lubridate
和dplyr
转换日期,提取日期和小时,然后按日期过滤一小时内的最短时间。我把你的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