如何分别基于POSIXct和Date合并大型与小型数据集?
嘿,我来帮你搞定这个日期匹配的问题!你要把每日温度数据关联到小时级的观测里,核心其实是统一两个数据集的日期类型,再做匹配——之前用data.table的roll="nearest"没成功,大概率是因为你没处理好POSIXct和Date格式的差异~
我给你两种靠谱的解决方案,先从最直接的data.table方法说起,再补一个tidyverse的版本,你可以按需选用:
方法1:data.table 等值连接(最贴合你的需求)
首先我们先构造和你场景一致的示例数据,方便你跟着跑:
library(data.table) set.seed(123) # 构造500条左右的小时级数据集(POSIXct格式的date.time) hourly_data <- data.table( date.time = seq.POSIXt(as.POSIXct("2023-01-01 00:00:00"), as.POSIXct("2023-01-21 11:00:00"), by = "hour"), some.value = rnorm(500) ) # 构造10条每日温度数据集(Date格式的date) daily_temp <- data.table( date = seq.Date(as.Date("2023-01-01"), as.Date("2023-01-10"), by = "day"), temperature = runif(10, min = 5, max = 25) )
接下来只需要两步:
- 给小时数据集新增一个
date列(转成和温度数据集一致的Date格式) - 按
date做等值连接,把温度匹配到对应日期的所有小时观测上
# 新增Date格式的date列 hourly_data[, date := as.Date(date.time)] # 执行连接,temperature会自动匹配到对应日期的每一行 result <- hourly_data[daily_temp, on = "date"] # 查看结果前几行确认 head(result)
这个方法比用roll="nearest"更精准,因为你要的是当天的温度,不是“最近时间点的温度”——毕竟每日温度是整一天的观测,直接按日期匹配最合理。
方法2:dplyr + left_join(tidyverse风格)
如果你习惯用tidyverse的语法,也可以这么写:
library(dplyr) result <- hourly_data %>% # 把date.time转成Date格式的date列 mutate(date = as.Date(date.time)) %>% # 左连接温度数据集,按date匹配 left_join(daily_temp, by = "date")
为啥之前的roll="nearest"没成功?
你之前的问题大概率出在时间变量类型不统一:一个是POSIXct(带时分秒),一个是Date(只有日期),直接用setkey会导致data.table无法正确识别时间对应关系。如果一定要用roll的方式,得先把两个数据集的时间转成同一种类型(比如都转成POSIXct),不过完全没必要——等值连接已经完美解决你的需求啦!
内容的提问来源于stack exchange,提问作者user9195416
相关产品推荐
相关产品推荐

