Eu tenho duas tabelas chamadas dates
e items
:
#dates table
from <- c(as.Date("2022/1/1"), as.Date("2022/3/1"), as.Date("2022/5/1"))
to <- c(as.Date("2022/1/25"), as.Date("2022/3/17"), as.Date("2022/5/30"))
id <- c(1,1,2)
dates <- data.frame(from, to, id)
#items table
item_id <- c(1, 1, 2)
date <- c(as.Date("2022/1/5"), as.Date("2022/3/4"), as.Date("2022/1/4"))
items <-data.frame(item_id, date)
#end result
from <- c(as.Date("2022/1/1"), as.Date("2022/3/1"), NA)
to <- c(as.Date("2022/1/25"), as.Date("2022/3/17"), NA)
end_result <- data.frame(item_id, date, from, to)
O dates
df precisa se juntar ao items
df onde o ID corresponde e também onde a data do items
df está entre as datas de e para do dates
df. O end_result
dataframe mostra os resultados esperados.
Alguém tem alguma sugestão sobre como conseguir isso?
1) sqldf Uniu os itens à esquerda nas datas usando os critérios de associação indicados. from e to são palavras reservadas do SQL, então coloque-as entre colchetes.
2) dplyr Funciona da mesma maneira.
Uma
data.table
solução:O acima é atribuído a uma nova tabela
end_result
, mas você pode evitar fazer uma cópia extra de todos os dados atualizandoitems
no local. Basta começar comsetDT(items)[dates,
em vez deend_result <- as.data.table(items)[dates,
.