我正在处理一个网格化数据集,该数据集是从我拉到R中的几个来源整理到R中的。目前,该数据集相对较大,但是当我扩大规模使用超过2个小时时,数据将很快变得相当大。我已经将雷达数据(时间戳,纬度,经度和反射率以及降雨量(毫米/小时))提取到一个名为local_grid的数据框中。我还提取了一个道路数据框,该数据框包含一个经纬度,并且处于感兴趣状态下的每个路段的长度(还有一些其他变量,但在这里并不重要)。
下面的我的网格数据框...
> str(local_grid)
data.frame': 1836289 obs. of 5 variables:
$ latitude : num 41.7 41.7 41.8 41.8 41.8 ...
$ longitude: num -85.7 -85.7 -85.7 -85.7 -85.7 ...
$ tstamp : POSIXct, format: "2018-06-09 15:00:00" "2018-06-09 15:00:00" "2018-06-09 15:00:00" "2018-06-09 15:00:00" ...
$ dBz : num 0 0 0 0 0 0 0 0 0 0 ...
$ rainfall : num 0 0 0 0 0 0 0 0 0 0 ...
下面的我的道路数据框...
> str(road)
'data.frame': 4448 obs. of 8 variables:
$ XDSegID : Factor w/ 4446 levels "136011583","136342048",..: 1 2 3 4 5 6 7 8 9 10 ...
$ RoadNumber: int 90 90 90 90 69 69 90 69 65 65 ...
$ RoadName : Factor w/ 58 levels "I 80;I 90","I 69",..: 1 1 1 1 2 2 1 2 3 3 ...
$ Bearing : Factor w/ 4 levels "W","E","S","N": 1 2 1 2 3 4 2 3 3 4 ...
$ junk : chr "" "" "" "" ...
$ longitude : num -85.7 -86.3 -86.3 -86.3 -85 ...
$ latitude : num 41.7 41.7 41.7 41.7 41.7 ...
$ roadBuffer: Factor w/ 4446 levels "POLYGON ((-85.6748336265716 41.703074152800177, -85.671149885352776 41.702992664842135, -85.667466403319835 41."| __truncated__,..: 1 2 3 4 5 6 7 8 9 10 ...
对于雷达数据中的每个时隙,我需要将雷达数据内插到与每个路段相关的纬度/经度。我的尝试是初始化一个空的数据框,然后从那里开始。
interpolated <- data.frame(tstamp = as.POSIXct(character(), origin = "1970-01-01"),
latitude = numeric(),
longitude = numeric(),
Interpolated_dBz = integer())
从那里,我可以开始填写此数据框(这是我的困难所在)。在此示例中,我知道我可以从数据帧中得到的期望,例如,有4,448个路段和92个离散的时隙,因此,我希望数据帧中具有409,216个条目,如下所示... < / p>
tstamp | lat | lng | dBz
2018-06-09 15:00:00 | 41.749 |-85.66543| 35.044
2018-06-09 15:00:00 | 41.722 |-86.29026| 39.388
. | | |
. | | |
. | | |
2018-06-09 15:02:00 | 41.749 |-85.66543| 35.044
#And so on, with each time slot getting 4,448 entries
我的问题有两个方面,首先,如何有效地构建这个庞大的数据帧,以便它可以适当地缩放一半;其次,(相关)我如何从我的akima插值中提取dBz值,即如下所示...
#subset data to one time slot
subset_local_grid <- filter(local_grid, local_grid$tstamp == allTimes[1])
#find the closest points to xo/yo from road using the lat/lng and dbz from the subset
output <- akima::interp(x = subset_local_grid$longitude, y = subset_local_grid$latitude, z = subset_local_grid$dBz,
xo = road$longitude, yo = road$latitude, linear = T, duplicate = "strip")
akima插值产生具有以下结构的大列表对象(151 Mb)
> str(output)
List of 3
$ x: num [1:4448] -85.7 -86.3 -86.3 -86.3 -85 ...
$ y: num [1:4448] 41.7 41.7 41.7 41.7 41.7 ...
$ z: num [1:4448, 1:4448] 0 0 0 0 33.8 ...
从akima docs z是一个“拟合z值的矩阵。值z [i,j]是在x,y点计算的 xo [i],yo [j]。 z的尺寸为长度(xo)乘以长度(yo)。”
我一直在尝试使用循环来提取信息并将其输入到我的数据框中(我知道效率不高),但是到目前为止我还没有运气。我不确定如何处理akima :: interp提供的矩阵。解决该问题的任何帮助将不胜感激。