如何分别合并POSIXct和Date上的大数据集和小数据集?
How to merge a large dataset and a small dataset on POSIXct and Date respectively?
主题
我有两个(简化的)数据集:
- 每小时对 some.value 进行 500 次观察的数据集(date.time 变量为 POSIXct)
- 10个每日温度的数据集(日期变量为Date)
objective是将第二个数据集的温度作为新变量添加到第一个数据集,其中变量date.time对应日期变量。
我根据
使用 setkey() 和 roll="nearest" 尝试了 data.table 解决方案
不幸的是,合并后的温度对于整个合并后的数据集始终是相同的值。
一个简化的例子
这是说明我的问题和我的解决方案尝试的示例代码:
设置随机种子
set.seed(10)
正在生成两个数据集
observations <- data.frame(date.time = seq(from=ymd_hms("2017-02-01 00:00:00"), length.out=500, by=60*60), some.value = runif(500,0.0,1.0))
daily.temperature <- data.frame(date = seq(from=as.Date("2017-02-01"), length.out = 10, by=1), temperature = runif(10,10,40))
解决方案尝试使用 data.tables 和 roll="nearest"
# converting dataframes to datatables
library(data.table)
observations <- as.data.table(observations)
daily.temperature <- as.data.table(daily.temperature)
# setting the keys of the two datasets
setkey(observations,date.time)
setkey(daily.temperature,date)
# Combinding the datasets
combined <- daily.temperature[observations, roll = "nearest" ]
combined
请注意,无论日期如何,组合数据集中的温度变量始终相同。
关于未简化(真实)问题的注释:
- 在我的实际问题中,每分钟而不是每小时记录一次观察结果。
- 在我的实际问题中,daily.temperature 数据集并未涵盖整个观察范围。在那种情况下,添加 'NA' 或什么都不添加,因为温度会很好。
你想要这样的东西吗?
set.seed(10)
library(dplyr)
observations <- data.frame(date.time = seq(from=ymd_hms("2017-02-01 00:00:00"), length.out=500, by=60*60), some.value = runif(500,0.0,1.0))
daily.temperature <- data.frame(date = seq(from=as.Date("2017-02-01"), length.out = 10, by=1), temperature = runif(10,10,40))
observations$date<-as.Date(observations$date.time)
combined<-left_join(observations,daily.temperature,by="date")
> head(combined)
date.time some.value date temperature
1 2017-02-01 00:00:00 0.8561467 2017-02-01 38.64702
2 2017-02-01 01:00:00 0.7820957 2017-02-01 38.64702
3 2017-02-01 02:00:00 0.2443390 2017-02-01 38.64702
4 2017-02-01 03:00:00 0.3138552 2017-02-01 38.64702
5 2017-02-01 04:00:00 0.1284753 2017-02-01 38.64702
6 2017-02-01 05:00:00 0.9299472 2017-02-01 38.64702
主题
我有两个(简化的)数据集:
- 每小时对 some.value 进行 500 次观察的数据集(date.time 变量为 POSIXct)
- 10个每日温度的数据集(日期变量为Date)
objective是将第二个数据集的温度作为新变量添加到第一个数据集,其中变量date.time对应日期变量。
我根据
不幸的是,合并后的温度对于整个合并后的数据集始终是相同的值。
一个简化的例子
这是说明我的问题和我的解决方案尝试的示例代码:
设置随机种子
set.seed(10)
正在生成两个数据集
observations <- data.frame(date.time = seq(from=ymd_hms("2017-02-01 00:00:00"), length.out=500, by=60*60), some.value = runif(500,0.0,1.0))
daily.temperature <- data.frame(date = seq(from=as.Date("2017-02-01"), length.out = 10, by=1), temperature = runif(10,10,40))
解决方案尝试使用 data.tables 和 roll="nearest"
# converting dataframes to datatables
library(data.table)
observations <- as.data.table(observations)
daily.temperature <- as.data.table(daily.temperature)
# setting the keys of the two datasets
setkey(observations,date.time)
setkey(daily.temperature,date)
# Combinding the datasets
combined <- daily.temperature[observations, roll = "nearest" ]
combined
请注意,无论日期如何,组合数据集中的温度变量始终相同。
关于未简化(真实)问题的注释:
- 在我的实际问题中,每分钟而不是每小时记录一次观察结果。
- 在我的实际问题中,daily.temperature 数据集并未涵盖整个观察范围。在那种情况下,添加 'NA' 或什么都不添加,因为温度会很好。
你想要这样的东西吗?
set.seed(10)
library(dplyr)
observations <- data.frame(date.time = seq(from=ymd_hms("2017-02-01 00:00:00"), length.out=500, by=60*60), some.value = runif(500,0.0,1.0))
daily.temperature <- data.frame(date = seq(from=as.Date("2017-02-01"), length.out = 10, by=1), temperature = runif(10,10,40))
observations$date<-as.Date(observations$date.time)
combined<-left_join(observations,daily.temperature,by="date")
> head(combined)
date.time some.value date temperature
1 2017-02-01 00:00:00 0.8561467 2017-02-01 38.64702
2 2017-02-01 01:00:00 0.7820957 2017-02-01 38.64702
3 2017-02-01 02:00:00 0.2443390 2017-02-01 38.64702
4 2017-02-01 03:00:00 0.3138552 2017-02-01 38.64702
5 2017-02-01 04:00:00 0.1284753 2017-02-01 38.64702
6 2017-02-01 05:00:00 0.9299472 2017-02-01 38.64702