我有一个如下所示的数据框:
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点到下午4点之间)如果每小时至少有一个数据点(上午11点,下午12点,下午2点,下午3点,下午4点,下午4点)每一天。我想最终总结每天每个时间间隔(上午11点到下午4点)的mat.3值。
我做过尝试:
sub.1 <- subset(t,format(times,'%H')>='11' & format(times,'%H')<='16')
但这会返回上午11点到下午4点之间任何时间的所有数据,但通常我只会提供数据,例如特定日期的12点和1点PM。
我只想要从上午11点到下午4点每小时都有数据的日子。我有什么想法可以试试吗?
答案 0 :(得分:0)
尝试在数据框中创建一个只有小时的新变量。
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),]
答案 1 :(得分:0)
@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)