如果我有时间间隔之间的所有数据,则按时间间隔子集数据
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)
我有一个如下所示的数据框:
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)