如何使用预定义级别切割两个 Posixct 序列
How to cut two Posixct sequences using predefined levels
我需要将两个 POSIXct 5 分钟序列聚合成 10 分钟序列。
为此,我想从两个 5 分钟的序列中创建一个 10 分钟的密钥,以便两者使用相同的级别。
我想知道是否有 R 方法可以做到这一点?
这是一个例子:
a = seq(as.POSIXct("2012-06-01 06:01"), by = "5 min", length.out = 24)
b = seq(as.POSIXct("2012-06-01 06:07"), by = "5 min", length.out = 24)
cut(a, "10 min")
cut(b, "10 min")
您会注意到 seq a 和 b 使用不同的级别
现在您可以采取一些技巧来解决这个问题,但这并不是很好
b_adjusted = b-min(abs(min(as.POSIXct(cut(a, "10 min")))-b))
cut(b_adjusted, "10 min")
或
keys = cut(c(a,b), "10 min")
a = keys[1:length(a)]
b = keys[(length(a)+1):(length(a)+length(b))]
这只是一个例子,我的实际案例涉及>10个序列。
理想情况下,我可以使用从第一轮 10 分钟级别开始的级别剪切,例如,如果我序列中的第一项是 00:17,那么生成的密钥是 00:10
也许可以组合所有向量,然后生成从 min
到 max
值的 10 分钟序列。
library(lubridate)
combined_seq <- c(a, b)
lvls <- seq(floor_date(min(combined_seq), '10 mins'),
ceiling_date(max(combined_seq), '10 mins'), by = '10 mins')
然后您可以将此 lvls
用作 cut
中的关卡。
cut(a, levels)
cut(b, levels)
我们使用基数 R 形成一个输入列表,L
,并从中计算一个向量列表 L10
,如果我们使用题;然而,如果这不是一般情况,我们可以从中创建一组水平 levs
,给出具有共同水平的因素列表 L10f
。
min10.POSIXct <- function(x) { # returns POSIXct arg truncated to 10 min
as.POSIXct(600 * floor(as.numeric(a) %/% 600), origin = "1970-01-01")
}
L <- list(a, b)
L10 <- lapply(L, min10.POSIXct)
# empty result shows they have same values
length(setdiff(L10[[1]], L10[[2]]))
## [1] 0
rng <- range(do.call("range", L10))
levs <- format(seq(rng[1], rng[2], "10 min"))
L10f <- lapply(L10, factor, levs)
更新
修改了几次
我需要将两个 POSIXct 5 分钟序列聚合成 10 分钟序列。 为此,我想从两个 5 分钟的序列中创建一个 10 分钟的密钥,以便两者使用相同的级别。
我想知道是否有 R 方法可以做到这一点?
这是一个例子:
a = seq(as.POSIXct("2012-06-01 06:01"), by = "5 min", length.out = 24)
b = seq(as.POSIXct("2012-06-01 06:07"), by = "5 min", length.out = 24)
cut(a, "10 min")
cut(b, "10 min")
您会注意到 seq a 和 b 使用不同的级别
现在您可以采取一些技巧来解决这个问题,但这并不是很好
b_adjusted = b-min(abs(min(as.POSIXct(cut(a, "10 min")))-b))
cut(b_adjusted, "10 min")
或
keys = cut(c(a,b), "10 min")
a = keys[1:length(a)]
b = keys[(length(a)+1):(length(a)+length(b))]
这只是一个例子,我的实际案例涉及>10个序列。 理想情况下,我可以使用从第一轮 10 分钟级别开始的级别剪切,例如,如果我序列中的第一项是 00:17,那么生成的密钥是 00:10
也许可以组合所有向量,然后生成从 min
到 max
值的 10 分钟序列。
library(lubridate)
combined_seq <- c(a, b)
lvls <- seq(floor_date(min(combined_seq), '10 mins'),
ceiling_date(max(combined_seq), '10 mins'), by = '10 mins')
然后您可以将此 lvls
用作 cut
中的关卡。
cut(a, levels)
cut(b, levels)
我们使用基数 R 形成一个输入列表,L
,并从中计算一个向量列表 L10
,如果我们使用题;然而,如果这不是一般情况,我们可以从中创建一组水平 levs
,给出具有共同水平的因素列表 L10f
。
min10.POSIXct <- function(x) { # returns POSIXct arg truncated to 10 min
as.POSIXct(600 * floor(as.numeric(a) %/% 600), origin = "1970-01-01")
}
L <- list(a, b)
L10 <- lapply(L, min10.POSIXct)
# empty result shows they have same values
length(setdiff(L10[[1]], L10[[2]]))
## [1] 0
rng <- range(do.call("range", L10))
levs <- format(seq(rng[1], rng[2], "10 min"))
L10f <- lapply(L10, factor, levs)
更新
修改了几次