【问题标题】:subsetting ID and dates in data.table Rdata.table R中的子集ID和日期
【发布时间】:2020-02-06 06:09:17
【问题描述】:

我有一个类似于我创建的下一个示例的大矩阵(我有 70 列和数百万行):

a <- seq(as.IDate("2011-12-30"), as.IDate("2014-01-04"), by="days")
data <- data.table(ID = 1:length(a), date1 = a)

我想提取 ID 中的所有行,它包含个人的 ID,以及我需要从该个人那里提取的日期。一个人可以有多行。

a <- seq(as.IDate("2011-12-30"), as.IDate("2014-01-04"), by="week")
b <- seq(as.IDate("2012-01-01"), as.IDate("2014-01-06"), by="week")
IDs <- data.table(ID = 1:length(a), date1 = a, date2 = b)

目前,我的解决方案不是很快,什么会更好?

A <- list()
for(i in 1:dim(IDs)[1]){  
 A[[i]] <- data[ID == IDs[i,ID] & (date1 %between% IDs[i,.(date1,date2)]),]
}

【问题讨论】:

    标签: r data.table subset


    【解决方案1】:

    我认为您正在寻找非 equi 内连接:

    IDs[data, on=.(ID, date1<=date1, date2>=date1), nomatch=0L, .(ID, date1=i.date1)]
    

    或关联,

    data[IDs, on=.(ID, date1>=date1, date1<=date2), nomatch=0L, .(ID, date1=x.date1)]
    

    或将其视为非等半连接:

    data[IDs[data, on=.(ID, date1<=date1, date2>=date1), nomatch=0L, which=TRUE]]
    

    输出:

       ID      date1
    1:  1 2011-12-30
    

    【讨论】:

      猜你喜欢
      • 2018-07-24
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      相关资源
      最近更新 更多