ID поднабора и даты в data.table R - PullRequest
3 голосов
/ 09 октября 2019

У меня есть большая матрица, похожая на следующий пример, который я создаю (у меня 70 столбцов и миллионы строк):

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

Я хочу извлечь все те строки, которые есть в идентификаторах, он содержитудостоверение личности и даты, которые мне нужно извлечь из этого лица. У человека может быть несколько строк.

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)]),]
}

1 Ответ

3 голосов
/ 09 октября 2019

Я думаю, что вы ищете неэквивалентное внутреннее объединение:

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