在R

时间:2018-07-03 20:26:56

标签: r dataframe bigdata interpolation

我正在处理一个网格化数据集,该数据集是从我拉到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提供的矩阵。解决该问题的任何帮助将不胜感激。

0 个答案:

没有答案