R 根据数据范围和变量组合填充数据值

  • 本文关键字:数据 组合 填充 变量 范围 r
  • 更新时间 :
  • 英文 :


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

兆威

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

多亏了@thelatemail这个解决方案才起作用:

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

最新更新