我有一些数据,格式为起始时间和结束时间(以分钟:秒的格式)。一个简单的例子可能是灯打开的时间戳和随后灯关闭的时间戳。
例如:
Start Stop
00:03.1 00:40.9
00:55.0 01:38.2
01:40.0 02:01.1
我希望能够重新排列数据,以便最终可以在R中按整分钟间隔查看数据。
选项1:将数据转换为每十分之一秒的二进制列表,然后按时间戳稍后聚合数据。
Time.in.sec Yes.or.No
0.0 N
0.1 N
... ...
3.0 N
3.1 Y
3.2 Y
... ...
40.8 Y
40.9 N
... ...
选项2: 将时间间隔分割为分钟标记,并使用某种逻辑规则按分钟聚合总时间(从时间 = 0:00.0 开始)。Start Stop
00:03.10 00:40.90
00:55.00 00:59.99
01:00.00 01:38.20
01:40.00 01:59.99
02:00.00 02:01.10
我尝试过研究lubridate函数 (即将每个范围转换为间隔类),以及cut(),但似乎无法弄清楚如何使这些想法之一起作用。 我也不清楚像zoo这样的包是否适合此操作;老实说,我对日期/时间格式和时间序列的经验非常少。
Stackoverflow上的其他问题似乎是针对从原始时间戳制作存储箱 (例如 What is an efficient method for partitioning and aggregating intervals from timestamped rows in a data frame? 和 Aggregate data by equally spaced time intervals in R), 但我基本上想做相反的事情。
编辑1:这是一个CSV格式的示例数据,截至第6分钟。
Start, Stop
00:03.1, 00:40.9
00:55.0, 01:38.2
01:40.0, 02:01.1
03:03.1, 04:30.3
04:50.0, 05:01.5
05:08.7, 05:22.0
05:40.1, 05:47.9
EDIT 2:我的最终目标是将数据格式化,以便我可以将观测值分成规范的时间段(第1分钟,第2分钟等)来获取按分钟计算的“是”的数据百分比。基本上,我想得到每分钟状态分布的摘要,由于数据是二进制的,所以我可以通过查看“是”状态来完成此操作。
对于前3分钟(从00:00.0到03:00.0),输出将类似于以下内容:
Minute time.yes.sec perc.time.yes
1 42.8 71.33
2 58.2 96.98
3 1.1 1.83
# *NOTE: Here, Minute 1 = [0, 60), Minute 2 = [60, 120), etc.; I'm not opposed
# to the reverse definitions though (Minute 1 = (0, 60], etc.).
我可以选择将数据查看为累积分布图,每个连续时间点更新“总时间是”的值。然而,如果我能以选项1的格式获取数据,我就可以灵活地查看数据。
library(tidyverse) ; df %>% mutate_all(funs(as.numeric(lubridate::ms(.)))) %>% rowwise() %>% mutate(instant = list(seq(Start, Stop, by = 0.1))) %>% unnest() %>% mutate(minute = cut(instant, (0:6) * 60)) %>% group_by(minute) %>% summarise(elapsed = (n()-1)/10)
- alistaire