У меня есть 2 кадра данных, которые были объединены вместе: 1. с мелкомасштабными данными GPS-положения вместе с датами и идентификатором сайта; и 2. наблюдения с каждого сайта, включая идентификатор сайта, индивидуальный идентификатор, а также время начала и окончания мониторинга на данном сайте. В объединенном фрейме данных некоторые из отдельных значений идентификатора являются NA, потому что две таблицы не совпадают по дате, времени и идентификатору сайта. Однако я хочу указать индивидуальный идентификатор, в котором идентификаторы сайта совпадают, а дата и время находятся между датами начала и окончания, связанными с этим событием мониторинга. Все эти поля доступны в одной таблице. В настоящее время я использую al oop для заполнения недостающих индивидуальных идентификаторов, но у меня миллионы строк, и это очень неэффективно. Есть предложения по повышению эффективности?
MWE
library(tidyverse)
dates = seq(as.Date('2020/01/01'), as.Date('2020/05/01'), by="day")
df1 = data.frame(site = rep(1:2,each = 5),
date_time = c(dates[1:5], dates[10:14]),
lat = rnorm(10,0,20),
lon=rnorm(10,150,180))
df2 = data.frame(site = c(1,2), id = c('A','B'),
start = c(dates[1], dates[10]),
date_time = c(dates[2], dates[11]),
end=c(dates[5], dates[14]) )
dat = merge(df1,df2,all=T)
Для l oop, используемого для решения этой проблемы (неэффективно)
for(i in 1:nrow(dat)){
tmp = dat[i,]
if(!is.na(dat[i,'id'])){next}
dat[i,'id'] = df2 %>% filter(site==tmp$site, start<=tmp$date_time, end>=tmp$date_time) %>% pull(id)
}