r-从日期向量中选择并分组相似的日期



我有三个POSIX格式的日期向量,它们对应于三个大型数据集的数据收集时间。这些矢量中的每一个都具有不同的长度,并且具有相似(但不相同(的日期。

我想:

  1. 将这些日期分组到指定的时间范围内,例如,将30天窗口内的每个矢量的日期分组
  2. 减少日期分组的数量以反映具有最小收集次数的数据集;数据集A";具有三个采样日期;数据集B";则只有三组日期(除非"数据集B"中的两个额外日期落在"数据集A"中的日期的30天内(

POSIX格式的三个日期矢量的示例(我想在矢量之间对相似的日期进行分组,允许30天的时间窗口(:

A.dates = as.POSIXlt(c("1998-07-24 08:00","1999-07-24 08:00","2000-07-24 08:00"), 
tz = "America/Los_Angeles")
B.dates = as.POSIXlt(c("1998-07-25 08:00","1999-07-25 08:00","2000-07-25 08:00"), 
tz = "America/Los_Angeles")
C.dates = as.POSIXlt(c("1998-07-26 08:00","1999-07-26 08:00","2000-07-26 08:00","2000-08-29"), 
tz = "America/Los_Angeles") 

指定30天的时间窗口,将有三个日期分组(采样日期分别为1998年、1999年和2000年7月(。C.dates矢量的第四个采集日期为2000年8月29日,这将被排除在分组之外,因为:

  1. 在其他矢量中,它不在7月日期的30天内,并且
  2. 在2000年8月29日的30天内,其他两个矢量中没有日期

您可以在每个向量的每个元素上循环,并创建seq影响±15天的

L <- list(A.dates, B.dates, C.dates)
tmp <- lapply(L, function(x) lapply(x, function(x) 
do.call(seq, c(as.list(as.Date(x) + c(-15, 15)), "day"))))

并且CCD_ 3将它们放在列表中。

tmp <- lapply(tmp, function(x) as.Date(Reduce(union, x), origin="1970-01-01"))

然后简单地找到intersect

i <- Reduce(function(...) as.Date(intersect(...), origin="1970-01-01"), tmp)

并相应地选择日期。

tmp <- lapply(L, function(x) x[as.Date(x) %in% i])
tmp
# [[1]]
# [1] "1998-07-24 08:00:00 PDT" "1999-07-24 08:00:00 PDT"
# [3] "2000-07-24 08:00:00 PDT"
# 
# [[2]]
# [1] "1998-07-25 08:00:00 PDT" "1999-07-25 08:00:00 PDT"
# [3] "2000-07-25 08:00:00 PDT"
# 
# [[3]]
# [1] "1998-07-26 PDT" "1999-07-26 PDT" "2000-07-26 PDT"

为了根据您的意见按年份排序,我们首先unlist。不幸的是,这将日期转换为数字(即1970年1月1日以来的秒数(,因此我们需要将它们转换回数字。

tmp <- as.POSIXlt(unlist(lapply(tmp, as.POSIXct)), origin="1970-01-01",
tz="America/Los_Angeles")

最后,我们根据前四个substr的年份来split列表(不过我们也可以做split(tmp, strftime(tmp, "%Y"))(。

res <- split(tmp, substr(tmp, 1, 4))
res
# $`1998`
# [1] "1998-07-24 08:00:00 PDT" "1998-07-25 08:00:00 PDT"
# [3] "1998-07-26 00:00:00 PDT"
# 
# $`1999`
# [1] "1999-07-24 08:00:00 PDT" "1999-07-25 08:00:00 PDT"
# [3] "1999-07-26 00:00:00 PDT"
# 
# $`2000`
# [1] "2000-07-24 08:00:00 PDT" "2000-07-25 08:00:00 PDT"
# [3] "2000-07-26 00:00:00 PDT"

相关内容

  • 没有找到相关文章

最新更新