Matching timestamped data to closest time in another dataset. Properly vectorized? Faster way?
为了从第二个数据帧中提取数据,我在一个数据帧中尝试匹配第二个数据帧中最近的时间戳。下面是我的方法的一般示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | library(lubridate) data <- data.frame(datetime=ymd_hms(c('2015-04-01 12:23:00 UTC', '2015-04-01 13:49:00 UTC', '2015-04-01 14:06:00 UTC' ,'2015-04-01 14:49:00 UTC')), value=c(1,2,3,4)) reference <- data.frame(datetime=ymd_hms(c('2015-04-01 12:00:00 UTC', '2015-04-01 13:00:00 UTC', '2015-04-01 14:00:00 UTC' ,'2015-04-01 15:00:00 UTC', '2015-04-01 16:00:00 UTC')), refvalue=c(5,6,7,8,9)) data$refvalue <- apply(data, 1, function (x){ differences <- abs(as.numeric(difftime(ymd_hms(x['datetime']), reference$datetime))) mindiff <- min(differences) return(reference$refvalue[differences == mindiff]) }) data # datetime value refvalue # 1 2015-04-01 12:23:00 1 5 # 2 2015-04-01 13:49:00 2 7 # 3 2015-04-01 14:06:00 3 7 # 4 2015-04-01 14:49:00 4 8 |
除了速度非常慢之外,这很好用,因为参考数据框架在我的实际应用程序中非常大。此代码是否正确矢量化?是否有更快、更优雅的方式执行此操作?
我想知道这是否能够与data.table解决方案匹配以提高速度,但它是一个基本的R矢量化解决方案,应该比您的
1 2 3 4 5 | data$reefvalue <- reference$refvalue[ findInterval( data$datetime, c(-Inf, head(reference$datetime,-1))+ c(0, diff(as.numeric(reference$datetime))/2 )) ] # values are [1] 5 7 7 8 |
号
您可以使用"最近"选项尝试
1 2 3 | library(data.table) # v1.9.6+ setDT(reference)[data, refvalue, roll ="nearest", on ="datetime"] # [1] 5 7 7 8 |