使用 lubridate 根据时间 ranges/intervals 合并表
merging tables based on time ranges/intervals using lubridate
我正在尝试根据时间范围合并两个表。我只找到了一些不使用 lubridate
的旧答案(例如 Data Table merge based on date ranges)。
实际上,lubridate
提供了%within%
函数可以检查一个日期是否在一个区间内。我构建了一个最小的示例,想知道是否有一种方法可以根据重叠 dates/intervals 将这些数据帧合并在一起。所以检查 df1$Date
是否在 df2$interval
.
library(lubridate)
df1 <- data.frame(Date=c(ymd('20161222'),ymd('20161223'),ymd('20161228'),ymd('20170322')),
User=c('a','b','a','a'),
Units=c(1,2,3,1))
df2 <- data.frame(User=c('a','b','a'),
Start=c(ymd('20140101'), ymd('20140101'), ymd('20170101')),
End=c(ymd('20161231'),ymd('20170331'),ymd('20170331')),
Price=c(10,10,20))
df2$interval <- interval(df2$Start, df2$End)
我的预期输出是这样的
| |User |Date | Units| Price|
|:--|:----|:----------|-----:|-----:|
|1 |a |2016-12-22 | 1| 10|
|3 |a |2016-12-28 | 3| 10|
|6 |a |2017-03-22 | 1| 20|
|7 |b |2016-12-23 | 2| 10|
对于大型数据帧,这可能效率低下(因为您正在创建更大的匹配和子集化),而且我确信有更优雅的方法,但这可行:
output <- merge(df1,df2,by="User")[test$Date %within% test$interval,]
或者您可以使用循环:
for(x in 1:length(df1$User)){
df1$Price[x]<-df2[(df1$Date[x] %within% df2$interval)&df1$User[x]==df2$User,]$Price
}
我相信你也可以创建一个函数并使用 apply...
我正在尝试根据时间范围合并两个表。我只找到了一些不使用 lubridate
的旧答案(例如 Data Table merge based on date ranges)。
实际上,lubridate
提供了%within%
函数可以检查一个日期是否在一个区间内。我构建了一个最小的示例,想知道是否有一种方法可以根据重叠 dates/intervals 将这些数据帧合并在一起。所以检查 df1$Date
是否在 df2$interval
.
library(lubridate)
df1 <- data.frame(Date=c(ymd('20161222'),ymd('20161223'),ymd('20161228'),ymd('20170322')),
User=c('a','b','a','a'),
Units=c(1,2,3,1))
df2 <- data.frame(User=c('a','b','a'),
Start=c(ymd('20140101'), ymd('20140101'), ymd('20170101')),
End=c(ymd('20161231'),ymd('20170331'),ymd('20170331')),
Price=c(10,10,20))
df2$interval <- interval(df2$Start, df2$End)
我的预期输出是这样的
| |User |Date | Units| Price|
|:--|:----|:----------|-----:|-----:|
|1 |a |2016-12-22 | 1| 10|
|3 |a |2016-12-28 | 3| 10|
|6 |a |2017-03-22 | 1| 20|
|7 |b |2016-12-23 | 2| 10|
对于大型数据帧,这可能效率低下(因为您正在创建更大的匹配和子集化),而且我确信有更优雅的方法,但这可行:
output <- merge(df1,df2,by="User")[test$Date %within% test$interval,]
或者您可以使用循环:
for(x in 1:length(df1$User)){
df1$Price[x]<-df2[(df1$Date[x] %within% df2$interval)&df1$User[x]==df2$User,]$Price
}
我相信你也可以创建一个函数并使用 apply...