如果我有时间间隔之间的所有数据,则按时间间隔子集数据

subset data by time interval if I have all data between time interval

我有一个如下所示的数据框:

      X id mat.1      mat.2       mat.3               times
1     1  1  Anne 1495206060  18.5639404 2017-05-19 11:01:00
2     2  1  Anne 1495209660   9.0160321 2017-05-19 12:01:00
3     3  1  Anne 1495211460  37.6559161 2017-05-19 12:31:00
4     4  1  Anne 1495213260  31.1218856 2017-05-19 13:01:00
....
164 164  1  Anne 1497825060   4.8098351 2017-06-18 18:31:00
165 165  1  Anne 1497826860  15.0678781 2017-06-18 19:01:00
166 166  1  Anne 1497828660   4.7636241 2017-06-18 19:31:00

如果至少每个小时(上午 11 点、12 点、1 点、2 点、3 点、每天下午 4 点)。我想最终总结每天每个时间间隔(上午 11 点到下午 4 点)来自 mat.3 的值。

我试过了:

sub.1 <- subset(t,format(times,'%H')>='11' & format(times,'%H')<='16')

但是这个 returns 从上午 11 点到下午 4 点之间的任何时间的所有数据,但通常我只会有数据,例如给定日期的中午 ​​12 点和下午 1 点。

我只想要我拥有从上午 11 点到下午 4 点每小时数据的那几天的子集。有什么我可以尝试的想法吗?

尝试在您的数据框中创建一个只有小时的新变量。

your_data$hour<-format(your_data$times, format="%H:%M:%S") 

然后,使用这个新变量尝试做下一个:

#auxiliar variable with your interval of time
your_data$aux_var<-ifelse(your_data$hour >"11:00:00" || your_data$hour<"16:00:00" ,1,0)

因此,下一步是在 aux_var==1

时过滤数据
your_data[which(your_data$aux_var ==1),]

@Henry Navarro 回答的补充,用于解决问题中提到的其他问题。

如果我理解得当,问题的另一个关注点是找到日期,使得一天中给定时间间隔的每个小时至少有数据点。遵循@Henry Navarro 解决方案风格的可能方法如下:

library(lubridate)
your_data$hour_only <- as.numeric(format(your_data$times, format = "%H"))
your_data$days <- ymd(format(your_data$times, "%Y-%m-%d"))
your_data_by_days_list <- split(x = your_data, f = your_data$days)

# the interval is narrowed for demonstration purposes
hours_intervals <- 11:13
all_hours_flags <- data.frame(days = unique(your_data$days), 
    all_hours_present = sapply(function(Z) (sum(unique(Z$hour_only) %in% hours_intervals) >= 
    length(hours_intervals)), X = your_data_by_days_list), row.names = NULL)
your_data <- merge(your_data, all_hours_flags, by = "days")

现在有 "all_hours_present" 列,表示相应日期的数据至少包含给定 hours_intervals 中每个小时的一个值。您可以使用此列对您的数据进行子集化

subset(your_data, all_hours_present)