【问题标题】:merging tables based on time ranges/intervals using lubridate使用 lubridate 基于时间范围/间隔合并表
【发布时间】:2017-03-16 16:14:05
【问题描述】:

我正在尝试根据时间范围合并两个表。我只找到了一些不使用lubridate的旧答案(例如Data Table merge based on date ranges)。

其实lubridate 提供了%within% 函数,可以检查一个日期是否在一个区间内。我构建了一个最小的示例,并想知道是否有一种方法可以根据重叠的日期/间隔将这些数据帧合并在一起。所以检查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|

【问题讨论】:

  • 你能从玩具示例中展示你想要的输出吗?
  • 我更新了我的问题。

标签: r merge lubridate


【解决方案1】:

这对于大型数据帧可能效率低下(因为您要创建更大的匹配和子集),我相信有一种更优雅的方法,但这很有效:

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...

【讨论】:

  • 我考虑了合并策略而不是循环,但是阅读您的示例,这很简单......我只有小数据集,比如说nrow(df1) &lt;= 10000nrow(df2) &lt;= 50 所以这个可能是要走的路。我只想再等几天,也许有人想出了更好的解决方案,但现在,这已经帮助了我!谢谢
  • 很高兴它有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2010-12-16
  • 2016-10-09
  • 2017-02-10
  • 1970-01-01
相关资源
最近更新 更多