大型数据集的下一个值

问题描述 投票:0回答:1

我有数据表

odo    LAT  
2.62    30.20
5.19    
7.61
18.82
19.06   40.10
19.35
20.54
20.81    70.90

我需要获取每个记录的上一个和下一个odo。我还需要获取不为空的下一个经纬度。

最终结果看起来像

odo    LAT      PreviousODO   NextODO  NextLat
2.62    30.20                  5.19    40.10
5.19              2.62         7.61    40.10
7.61              5.19         18.82   40.10
18.82             7.61         19.06   40.10
19.06   40.10     18.82        19.35   70.90
19.35             19.06        20.54   70.90    
20.54             19.35        20.81   70.90
20.81    70.90    20.54   

我尝试执行以下操作,该操作对PreviousODO有所帮助,而NextOdo ..对于NextLat则完全不起作用。但是,当我将其应用于我的33K记录的较大数据集时。所有上一个和下一个odo都开始获得随机数。上一个和下一个odo应该基于odo顺序的数据。我尝试通过odo对数据进行排序,然后进行计算,但是仍然无法获得正确的结果。

atable<-data.table(odo = c(2.62, 5.19,7.61,18.82,19.06,19.35,20.54,20.81), LAT = c(30.2, NA,NA,NA,40.1,NA,NA,70.9))


atable[, PreviousOdo:=c(NA,odo[.I - 1]) ]
atable[, NextOdo:=c(NA,odo[.I + 2]) ]
atable[, NextLat:=c(NA,LAT[.I + 2]) ]
r data.table
1个回答
0
投票

您可以分两部分实现:

计算新的odo

atable[, newOdo := shift(odo, -1)]

借助软件包zoo计算新纬度:

atable[!is.na(LAT), newLat := shift(zoo::na.locf(LAT), -1)]
atable[, newLat := zoo::na.locf(newLat)]

结果:

atable
     odo  LAT newLat newOdo
1:  2.62 30.2   40.1   5.19
2:  5.19   NA   40.1   7.61
3:  7.61   NA   40.1  18.82
4: 18.82   NA   40.1  19.06
5: 19.06 40.1   70.9  19.35
6: 19.35   NA   70.9  20.54
7: 20.54   NA   70.9  20.81
8: 20.81 70.9   70.9     NA
© www.soinside.com 2019 - 2024. All rights reserved.