【问题标题】:Join tables by date range [duplicate]按日期范围连接表[重复]
【发布时间】:2014-07-20 11:19:40
【问题描述】:

我正在寻找按日期范围连接两个表的简单方法。一个表包含确切的日期,另一个表包含两个变量,标识时间段的开始和结束。如果第一个表中的日期在第二个表的范围内,我需要加入表。

data1 <- data.table(date = c('2010-01-21', '2010-01-25', '2010-02-02', '2010-02-09'),
                name = c('id1','id2','id3','id4'))


data2 <- data.table(beginning=c('2010-01-15', '2010-01-23', '2010-01-30', '2010-02-05'), 
                ending = c('2010-01-22','2010-01-29','2010-02-04','2010-02-13'),
                class = c(1,2,3,4))

result <- data.table(date = c('2010-01-21', '2010-01-25', '2010-02-02', '2010-02-09'),
                 beginning=c('2010-01-15', '2010-01-23', '2010-01-30', '2010-02-05'), 
                 ending = c('2010-01-22','2010-01-29','2010-02-04','2010-02-13'),
                 name = c('id1','id2','id3','id4'),
                 class = c(1,2,3,4))

有什么帮助吗?我发现了一些困难的例子,但由于格式的原因,它们甚至不适用于我的数据。我需要类似的东西:

select * from data1
left join
select * from data2
where data2.beginning <= data1.date <= data2.ending

谢谢

【问题讨论】:

  • 你试过sqldf包了吗?

标签: r date join merge range


【解决方案1】:

我知道以下内容看起来很糟糕,但这就是我想出的。最好使用“sqldf”包(见下文)。

library(data.table)
data1 <- data.table(date = c('2010-01-21', '2010-01-25', '2010-02-02', '2010-02-09'),
                    name = c('id1','id2','id3','id4'))


data2 <- data.table(beginning=c('2010-01-15', '2010-01-23', '2010-01-30', '2010-02-05'), 
                    ending = c('2010-01-22','2010-01-29','2010-02-04','2010-02-13'),
                    class = c(1,2,3,4))

result <- cbind(data1,"beginning"=sapply(1:nrow(data2),function(x) data2$beginning[data2$beginning[x]<data1$date & data2$ending[x]>data1$date]),
            "ending"=sapply(1:nrow(data2),function(x) data2$ending[data2$beginning[x]<data1$date & data2$ending[x]>data1$date]),
            "class"=sapply(1:nrow(data2),function(x) data2$class[data2$beginning[x]<data1$date & data2$ending[x]>data1$date]))

使用包sqldf:

library(sqldf)
result = sqldf("select * from data1
                left join data2
                on data1.date between data2.beginning and data2.ending")

使用 data.table 这很简单

data1[data2, on = .(date >= beginning, date <= ending)]

【讨论】:

  • 谢谢。在使用data.table 方法执行范围连接时,有没有办法避免写.on = .(date &gt;= beginning, date &lt;= ending) devtools::check 对这个点很恼火,我无法绕过它。
猜你喜欢
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
相关资源
最近更新 更多