我有一个具有以下时间序列的数据集:
20-05-2017 06:14:24 +00:00
20-05-2017 07:41:13 +00:00
20-05-2017 07:41:14 +00:00
20-05-2017 07:42:13 +00:00
20-05-2017 07:42:14 +00:00
20-05-2017 07:42:20 +00:00
20-05-2017 07:42:36 +00:00
20-05-2017 07:43:05 +00:00
我想做的是,如果在同一分钟,几小时或同一天内已经记录了一个数据点,则将其删除。要获得此结果(仅需要第一个数据点,而不是平均值):
20-05-2017 06:14:24 +00:00
20-05-2017 07:41:13 +00:00
20-05-2017 07:42:13 +00:00
20-05-2017 07:43:05 +00:00
关于如何在R中执行此操作的任何想法?我最初考虑过循环一个检查每条记录的语句,但是由于它是一个大数据集,所以我不知道这样做是否有效。
答案 0 :(得分:1)
您可以创建一个新变量,其中将包括日期和小时/分钟。在这种情况下,我将其转换为POSIXlt类型并提取了相关字段。使用duplicated
,我排除了在数据集中出现多次的任何事物。
xy <- read.table(text = "20-05-2017 06:14:24 +00:00
20-05-2017 07:41:13 +00:00
20-05-2017 07:41:14 +00:00
20-05-2017 07:42:13 +00:00
20-05-2017 07:42:14 +00:00
20-05-2017 07:42:20 +00:00
20-05-2017 07:42:36 +00:00
20-05-2017 07:43:05 +00:00", header = FALSE)
xy
xy$datetime <- paste(xy$V1, xy$V2)
xy$datetime <- as.POSIXlt(xy$datetime, format = c("%d-%m-%Y %H:%M:%S"))
xy$to_hm <- format(xy$datetime, format = "%d-%m-%Y %H:%M")
xy[!duplicated(xy$to_hm), ]
V1 V2 V3 datetime to_hm
1 20-05-2017 06:14:24 +00:00 2017-05-20 06:14:24 20-05-2017 06:14
2 20-05-2017 07:41:13 +00:00 2017-05-20 07:41:13 20-05-2017 07:41
4 20-05-2017 07:42:13 +00:00 2017-05-20 07:42:13 20-05-2017 07:42
8 20-05-2017 07:43:05 +00:00 2017-05-20 07:43:05 20-05-2017 07:43
答案 1 :(得分:1)
据我了解...
library(lubridate)
library(data.table)
data<-data.table(read.table(col.names = "time1", text = "20-05-2017 06:14:24 +00:00
20-05-2017 07:41:13 +00:00
20-05-2017 07:41:14 +00:00
20-05-2017 07:42:13 +00:00
20-05-2017 07:42:14 +00:00
20-05-2017 07:42:20 +00:00
20-05-2017 07:42:36 +00:00
20-05-2017 07:43:05 +00:00",sep=","))
data[,time:=dmy_hms(time1)]
data[,time_trunc:=floor_date(time,"minutes")]
data[,time_rank_inside_minute:=frank(time,ties.method = "random"),by=time_trunc]
data<-data[time_rank_inside_minute==1]
答案 2 :(得分:0)
require('lubridate')
require('tibble')
require('quantmod')
dfm <- tibble(index = dmy_hms(c('20-05-2017 06:14:24 +00:00', '20-05-2017 07:41:13 +00:00', '20-05-2017 07:41:14 +00:00', '20-05-2017 07:42:13 +00:00', '20-05-2017 07:42:14 +00:00', '20-05-2017 07:42:20 +00:00', '20-05-2017 07:42:36 +00:00', '20-05-2017 07:43:05 +00:00')))
> dfm %>% mutate(index = round_date(index, 'minute'))
# A tibble: 8 x 1
index
<dttm>
1 2017-05-20 06:14:00
2 2017-05-20 07:41:00
3 2017-05-20 07:41:00
4 2017-05-20 07:42:00
5 2017-05-20 07:42:00
6 2017-05-20 07:42:00
7 2017-05-20 07:43:00
8 2017-05-20 07:43:00
> dfm %>% mutate(index = round_date(index, 'minute')) %>% unique
# A tibble: 4 x 1
index
<dttm>
1 2017-05-20 06:14:00
2 2017-05-20 07:41:00
3 2017-05-20 07:42:00
4 2017-05-20 07:43:00