我有数据表
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]) ]
答案 0 :(得分:2)
您可以分两部分实现这一目标:
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