我有一个表示秒(1:60)的向量:
x <- c(3, 8, 12, 18, 25, 58, 4, 25, 44, 59, 8)
秒3
到58
是从0
开始的秒数。第二组秒4
到59
表示从58
秒过去的秒数,即最后一次在上一个块中注册的时间。例如。 4
表示从4
开始经过58
秒,对25-59
也是如此。最后8
表示从59
过去的秒。
我希望从各个参考点以秒为单位转换这些时间,因此它们都代表从0
开始经过的绝对秒数:
y <- c(3, 8, 12, 18, 25, 58, 62, 83, 102, 117, 125)
我们总结第6和第7个元素(58 + 4),第10个和第11个元素(59 + 8),甚至更多(每个接近60或甚至60)元素,并得到两个元素的每个差异。例如,4和25之间的差异是21. 21应该加到62并且y为83.
也许有POSIX或CHRON的解决方案,但我找不到解决这个问题的功能。
答案 0 :(得分:1)
这是另一种选择。稍微复杂一点,但似乎给出了理想的结果。
library(data.table)
d <- data.table(x)
创建分组变量&#39; m&#39;,相应的分钟,好像每个秒组从点分标记开始:
d[ , m := c(0, cumsum(diff(x) < 1))]
计算一个新的秒变量,再次,好像每个秒组从点分钟开始。例如,第二轮秒中的4
暂时对应于1分钟, 4 秒,64秒。
d[ , x2 := x + 60 * m]
然而,每个&#34;分钟内的秒数&#34>不是相对于组内分钟,而是相对于前一分钟的最后一次注册的秒数。因此,我们需要计算每分钟内最后一次注册的剩余秒数:
d2 <- d[ , .(dif = x[.N] - 60), by = m]
要将调整与正确的分钟对齐,请将它们向前移动。将第一分钟的调整设置为0
。计算每分钟内要调整的累计秒数:
d2[ , adj := cumsum(shift(dif, fill = 0))]
加入原始数据和调整数据,使用by = .EACHI
:
d[d2, .(s = x2 + adj), on = "m", by = .EACHI]
# m s
# 1: 0 3
# 2: 0 8
# 3: 0 12
# 4: 0 18
# 5: 0 25
# 6: 0 58
# 7: 1 62
# 8: 1 83
# 9: 1 102
# 10: 1 117
# 11: 2 125
我确信这可以简化。