R заполнить значение данных на основе диапазона данных и комбинаций переменных - PullRequest
1 голос
/ 26 мая 2020

У меня есть 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)
}

1 Ответ

1 голос
/ 26 мая 2020

Благодаря @thelatemail это решение сработало:

df2[df1, on=c("site","start<=date_time","end>=date_time")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...