首页 > 解决方案 > R根据数据范围和变量组合填充数据值

问题描述

我有 2 个数据框已合并在一起,1. 具有精细的 GPS 位置数据以及日期时间和站点 ID;2. 来自每个站点的观察结果,包括站点 ID、个人 ID 以及监测在给定站点开始和结束的时间。在合并的数据框中,一些单独的 id 值是 NA,因为这两个表在日期时间和站点 id 上不匹配。但是,我想填写站点 ID 匹配的单个 ID,并且日期时间介于与该监视事件关联的开始日期和结束日期之间。所有这些字段都在一张表中可用。我目前正在使用循环来填充缺少的个人 ID,但是我有数百万行并且效率非常低。有什么提高效率的建议吗?

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)

用于解决此问题的 for 循环(效率低下)

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

标签: r

解决方案


感谢@thelatemail,这个解决方案奏效了:

df2[df1, on=c("site","start<=date_time","end>=date_time")]

推荐阅读