大型数据集的下一个值

时间:2019-10-24 16:06:44

标签: r data.table

我有数据表

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]) ]

2 个答案:

答案 0 :(得分:2)

您可以分两部分实现这一目标:

计算新的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

答案 1 :(得分:1)

第一步:

atable[, c("PreviousODO", "NextODO", "NextLat") := 
           .(shift(odo), shift(odo, -1), nafill(shift(LAT, -1), "nocb"))]

     odo  LAT newLat newOdo PreviousODO NextODO NextLat
1:  2.62 30.2   5.19   30.2          NA    5.19    40.1
2:  5.19   NA   7.61   30.2        2.62    7.61    40.1
3:  7.61   NA  18.82   30.2        5.19   18.82    40.1
4: 18.82   NA  19.06   30.2        7.61   19.06    40.1
5: 19.06 40.1  19.35   40.1       18.82   19.35    70.9
6: 19.35   NA  20.54   40.1       19.06   20.54    70.9
7: 20.54   NA  20.81   40.1       19.35   20.81    70.9
8: 20.81 70.9     NA   70.9       20.54      NA      NA