r - 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)
}
解决方案
感谢@thelatemail,这个解决方案奏效了:
df2[df1, on=c("site","start<=date_time","end>=date_time")]
推荐阅读
- julia - 使用 `Base.@kwdef` 广播结构创建
- memory - 将 eMMC 格式化为 SD 格式
- mysql - 在查询 Knex 中创建一个数组
- azure-devops - Azure Pipeline - 获取关联的 git TAG?
- javascript - Google Apps 脚本 - 使用文本按钮和 URL 时出错
- javascript - 这个 Export 和 Import 语法在 JavaScript 中是什么意思?
- javascript - 如何使用 Firefox 从 Javascript 网页脚本中的剪贴板读取文本?
- excel - 在 Excel VBA 中获取无效的量词
- flutter - Flutter原生android传递依赖冲突(重复类)
- node.js - Mongo 远程身份验证从一台服务器工作,但不在另一台服务器上工作