【问题标题】:Find the closest date between dataset1 and dataset2查找 dataset1 和 dataset2 之间最接近的日期
【发布时间】:2017-06-30 06:11:33
【问题描述】:

我有两个数据集。一种大约每 5 天收集一次,另一种每天每 15 分钟收集一次。我想要一个最终列表,该列表将最接近的日期从不太频繁的数据集与更频繁的数据集中的条目相匹配。

例如:

satDat <- c('2015-04-16', '2015-04-21', '2012-04-26') # collected every 5 days

stationDat <- sort(rep(seq(as.Date("2015-04-01"), as.Date("2015-04-20"), by='day'),2)) 
#collected multiple times a day

 [1] "2015-04-01" "2015-04-01" "2015-04-02" "2015-04-02" "2015-04-03"
 [6] "2015-04-03" "2015-04-04" "2015-04-04" "2015-04-05" "2015-04-05"
[11] "2015-04-06" "2015-04-06" "2015-04-07" "2015-04-07" "2015-04-08"
[16] "2015-04-08" "2015-04-09" "2015-04-09" "2015-04-10" "2015-04-10"
[21] "2015-04-11" "2015-04-11" "2015-04-12" "2015-04-12" "2015-04-13"
[26] "2015-04-13" "2015-04-14" "2015-04-14" "2015-04-15" "2015-04-15"
[31] "2015-04-16" "2015-04-16" "2015-04-17" "2015-04-17" "2015-04-18"
[36] "2015-04-18" "2015-04-19" "2015-04-19" "2015-04-20" "2015-04-20"

我希望我的结果看起来像这样

[1] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
[6] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
[11] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
[16] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" 
[21] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
[26] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
[31] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
[36] "2015-04-16" "2015-04-21" "2015-04-21" "2015-04-21" "2015-04-21"

【问题讨论】:

  • 这个question的答案有帮助吗?
  • satDat[apply(abs(outer(satDat, stationDat, difftime, units = 'days')), 2, which.min)],虽然我怀疑还有更优雅的选择
  • 由于其中一个向量已排序,您可以利用cut 来缩小检查的可能日期,这样@alistaire 的解决方案就不会那么具有爆炸性。 (当然,这会是更多的代码,但如果您的数据足够大,这将非常有用。)
  • @alistaire 我喜欢你的解决方案,但是,一旦你将 stationDat 更改为更长的时间序列,比如 stationDat
  • 2015-04-26 不在satDat;它有 2012-04-26,这将远非一切......错字?无论如何,outer 将两个向量的每个组合与提供的函数(此处为difftime)进行比较,并返回一个矩阵,abs 在该矩阵上丢弃负数。 apply 遍历列(边距 2)并应用 which.min,它返回最小的索引,用于子集 satDat。如果是错字,我可以将其添加为带有完整解释的答案,因为似乎没有其他选择。

标签: r date lubridate


【解决方案1】:

使用outer的选项:

satDat[apply(abs(outer(satDat, stationDat, difftime, units = 'days')), 2, which.min)]

#>  [1] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
#>  [6] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
#> [11] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
#> [16] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
#> [21] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
#> [26] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
#> [31] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
#> [36] "2015-04-16" "2015-04-21" "2015-04-21" "2015-04-21" "2015-04-21"

它是如何工作的:

  • outerdifftime 应用于两个向量中的每一对元素,返回一个矩阵,
  • apply 遍历列 (MARGIN = 2),在每个列上调用 which.min,返回最小的索引,
  • 用于子集satDat

请注意,outer 分配一个维度为 length(satDat) 的矩阵 length(stationDat),如果您的数据已经很大,这可能需要大量内存。

【讨论】:

    【解决方案2】:

    我想到了 data.table 包提供的滚动连接。

    library(data.table)
    DT1 <- data.table(date = as.Date(satDat), date1 = as.Date(satDat))
    DT2 <- data.table(date = stationDat)
    
    DT1[DT2, date1, roll = "nearest", on = .(date)]
    # [1] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
    # [7] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
    #[13] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
    #[19] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
    #[25] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
    #[31] "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16" "2015-04-16"
    #[37] "2015-04-21" "2015-04-21" "2015-04-21" "2015-04-21"
    

    无论你的实际任务是什么,它可能也很有用,因为我怀疑它超出了这个范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多