我有一些动物运动数据,包括GPS点和相应的Datetime(软件包lubridate(。我的目标是计算每个连续日期/时间的GPS点之间的距离。问题是,这些积分是在不同的时间表上进行的——在14:00至04:00之间每小时进行一次,然后在10:00进行一次。在某些情况下,时间表中的时间缺少数据。样本数据:
structure(list(DateTime = structure(c(1484020800, 1484042400,
1484056860, 1484060400, 1484064000, 1484067600, 1484071200, 1484074800,
1484078400, 1484082000, 1484085600, 1484092800, 1484096400, 1484100000,
1484103600, 1484107200, 1484128800, 1484143200, 1484146860, 1484150400,
1484154000, 1484157600, 1484161200, 1484164800, 1484168400, 1484172000,
1484175600, 1484179200, 1484182800, 1484186400, 1484190000, 1484193600,
1484215200, 1484229600, 1484233200, 1484236800, 1484240400, 1484244000,
1484247600, 1484251200, 1484254800, 1484258400, 1484262000, 1484265600,
1484269200, 1484272800, 1484276400, 1484280000, 1484301600, 1484316000,
1484319600), tzone = "UTC", class = c("POSIXct", "POSIXt")),
Latitude = c(-13.53645, -13.53674, NA, -13.53669, -13.53675,
-13.53819, -13.54012, -13.54012, -13.5401, -13.54016, -13.54295,
-13.55006, -13.55251, -13.54522, -13.54204, -13.54156, -13.54141,
-13.54122, -13.54126, -13.54163, -13.54313, -13.55078, -13.55713,
-13.56645, -13.56664, -13.56663, -13.56662, -13.56667, -13.56668,
-13.56665, -13.56667, -13.56664, -13.56675, -13.5666, -13.56649,
-13.56648, -13.56647, -13.56884, -13.56874, -13.56879, -13.57121,
-13.5728, -13.57102, -13.5695, -13.5712, -13.57282, -13.57285,
-13.57285, -13.57293, -13.57285, -13.57284), Longitude = c(33.52862,
33.52891, NA, 33.52873, 33.52879, 33.53174, 33.53617, 33.53617,
33.53618, 33.53614, 33.53795, 33.54501, 33.53646, 33.52747,
33.52488, 33.52306, 33.52391, 33.52357, 33.52302, 33.52322,
33.52099, 33.51532, 33.50779, 33.50147, 33.4991, 33.49909,
33.49906, 33.49911, 33.49909, 33.49904, 33.49897, 33.49908,
33.49916, 33.49927, 33.49918, 33.49919, 33.49951, 33.50481,
33.50482, 33.50483, 33.50657, 33.51625, 33.5187, 33.51947,
33.52346, 33.52623, 33.52623, 33.52622, 33.52629, 33.52636,
33.52623), Info = c("3D", "3D", "GPS TimeOut", "3D", "3D",
"3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D",
"3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D",
"3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D",
"3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D", "3D",
"3D", "3D", "3D", "3D", "3D", "3D")), row.names = c(NA, -51L
), class = c("tbl_df", "tbl", "data.frame"))
我的目标是拥有一个数据帧,该数据帧由一段连续日期时间内连续GPS点之间的距离组成,与数据收集的时间表相匹配(即14:00-04:00和10:00(。在由于数据收集错误而丢失日期时间的情况下(其中"信息"列为"GPS超时"或"死亡率",而不是非错误的"3D"(,我想停止任何距离计算,直到下一系列连续的日期时间。提前感谢!
library(data.table)
library(geosphere)
setDT(mydata)
# create groups, start new group is where Infor is not 3D
mydata[, group := rleid(cumsum(!mydata$Info == "3D"))]
# get previous lat_lon
mydata[!Info == "GPS TimeOut", lon2 := shift(Longitude, type = "lag"), by = .(group)]
mydata[!Info == "GPS TimeOut", lat2 := shift(Latitude, type = "lag"), by = .(group)]
# calculate distances
mydata[!is.na(lon2), dist := distHaversine(matrix(c(Longitude, Latitude), ncol = 2),
matrix(c(lon2, lat2), ncol = 2))]
# cumulative distance by group *handle NA's
mydata[, cumdist := cumsum(ifelse(is.na(dist), 0, dist)), by = .(group)]
DateTime Latitude Longitude Info group lon2 lat2 dist cumdist
1: 2017-01-10 04:00:00 -13.53645 33.52862 3D 1 NA NA NA 0.000000
2: 2017-01-10 10:00:00 -13.53674 33.52891 3D 1 33.52862 -13.53645 45.024903 45.024903
3: 2017-01-10 14:01:00 NA NA GPS TimeOut 2 NA NA NA 0.000000
4: 2017-01-10 15:00:00 -13.53669 33.52873 3D 2 NA NA NA 0.000000
5: 2017-01-10 16:00:00 -13.53675 33.52879 3D 2 33.52873 -13.53669 9.315495 9.315495
6: 2017-01-10 17:00:00 -13.53819 33.53174 3D 2 33.52879 -13.53675 357.251547 366.567042
7: 2017-01-10 18:00:00 -13.54012 33.53617 3D 2 33.53174 -13.53819 525.378587 891.945628
8: 2017-01-10 19:00:00 -13.54012 33.53617 3D 2 33.53617 -13.54012 0.000000 891.945628
9: 2017-01-10 20:00:00 -13.54010 33.53618 3D 2 33.53617 -13.54012 2.475497 894.421126
10: 2017-01-10 21:00:00 -13.54016 33.53614 3D 2 33.53618 -13.54010 7.959379 902.380505
11: 2017-01-10 22:00:00 -13.54295 33.53795 3D 2 33.53614 -13.54016 367.195452 1269.575957
12: 2017-01-11 00:00:00 -13.55006 33.54501 3D 2 33.53795 -13.54295 1100.099008 2369.674965
13: 2017-01-11 01:00:00 -13.55251 33.53646 3D 2 33.54501 -13.55006 964.642282 3334.317247
14: 2017-01-11 02:00:00 -13.54522 33.52747 3D 2 33.53646 -13.55251 1266.933297 4601.250544
15: 2017-01-11 03:00:00 -13.54204 33.52488 3D 2 33.52747 -13.54522 451.532053 5052.782597
16: 2017-01-11 04:00:00 -13.54156 33.52306 3D 2 33.52488 -13.54204 204.088017 5256.870615
17: 2017-01-11 10:00:00 -13.54141 33.52391 3D 2 33.52306 -13.54156 93.494342 5350.364957
18: 2017-01-11 14:00:00 -13.54122 33.52357 3D 2 33.52391 -13.54141 42.442121 5392.807077
19: 2017-01-11 15:01:00 -13.54126 33.52302 3D 2 33.52357 -13.54122 59.690062 5452.497139
20: 2017-01-11 16:00:00 -13.54163 33.52322 3D 2 33.52302 -13.54126 46.529280 5499.026419
21: 2017-01-11 17:00:00 -13.54313 33.52099 3D 2 33.52322 -13.54163 293.474596 5792.501015
22: 2017-01-11 18:00:00 -13.55078 33.51532 3D 2 33.52099 -13.54313 1049.639556 6842.140572
23: 2017-01-11 19:00:00 -13.55713 33.50779 3D 2 33.51532 -13.55078 1078.760538 7920.901109
24: 2017-01-11 20:00:00 -13.56645 33.50147 3D 2 33.50779 -13.55713 1242.639048 9163.540158
25: 2017-01-11 21:00:00 -13.56664 33.49910 3D 2 33.50147 -13.56645 257.336592 9420.876749
26: 2017-01-11 22:00:00 -13.56663 33.49909 3D 2 33.49910 -13.56664 1.552488 9422.429237
27: 2017-01-11 23:00:00 -13.56662 33.49906 3D 2 33.49909 -13.56663 3.431958 9425.861195
28: 2017-01-12 00:00:00 -13.56667 33.49911 3D 2 33.49906 -13.56662 7.762437 9433.623632
29: 2017-01-12 01:00:00 -13.56668 33.49909 3D 2 33.49911 -13.56667 2.433775 9436.057407
30: 2017-01-12 02:00:00 -13.56665 33.49904 3D 2 33.49909 -13.56668 6.358316 9442.415723
31: 2017-01-12 03:00:00 -13.56667 33.49897 3D 2 33.49904 -13.56665 7.895348 9450.311071
32: 2017-01-12 04:00:00 -13.56664 33.49908 3D 2 33.49897 -13.56667 12.363073 9462.674144
33: 2017-01-12 10:00:00 -13.56675 33.49916 3D 2 33.49908 -13.56664 14.996281 9477.670425
34: 2017-01-12 14:00:00 -13.56660 33.49927 3D 2 33.49916 -13.56675 20.506423 9498.176848
35: 2017-01-12 15:00:00 -13.56649 33.49918 3D 2 33.49927 -13.56660 15.645952 9513.822799
36: 2017-01-12 16:00:00 -13.56648 33.49919 3D 2 33.49918 -13.56649 1.552488 9515.375287
37: 2017-01-12 17:00:00 -13.56647 33.49951 3D 2 33.49919 -13.56648 34.646209 9550.021496
38: 2017-01-12 18:00:00 -13.56884 33.50481 3D 2 33.49951 -13.56647 631.300217 10181.321714
39: 2017-01-12 19:00:00 -13.56874 33.50482 3D 2 33.50481 -13.56884 11.184421 10192.506135
40: 2017-01-12 20:00:00 -13.56879 33.50483 3D 2 33.50482 -13.56874 5.670191 10198.176326
41: 2017-01-12 21:00:00 -13.57121 33.50657 3D 2 33.50483 -13.56879 328.672043 10526.848369
42: 2017-01-12 22:00:00 -13.57280 33.51625 3D 2 33.50657 -13.57121 1062.331133 11589.179503
43: 2017-01-12 23:00:00 -13.57102 33.51870 3D 2 33.51625 -13.57280 330.983282 11920.162784
44: 2017-01-13 00:00:00 -13.56950 33.51947 3D 2 33.51870 -13.57102 188.608795 12108.771579
45: 2017-01-13 01:00:00 -13.57120 33.52346 3D 2 33.51947 -13.56950 471.416828 12580.188407
46: 2017-01-13 02:00:00 -13.57282 33.52623 3D 2 33.52346 -13.57120 349.811881 12930.000288
47: 2017-01-13 03:00:00 -13.57285 33.52623 3D 2 33.52623 -13.57282 3.339585 12933.339873
48: 2017-01-13 04:00:00 -13.57285 33.52622 3D 2 33.52623 -13.57285 1.082106 12934.421979
49: 2017-01-13 10:00:00 -13.57293 33.52629 3D 2 33.52622 -13.57285 11.691265 12946.113244
50: 2017-01-13 14:00:00 -13.57285 33.52636 3D 2 33.52629 -13.57293 11.691265 12957.804509
51: 2017-01-13 15:00:00 -13.57284 33.52623 3D 2 33.52636 -13.57285 14.111354 12971.915863
DateTime Latitude Longitude Info group lon2 lat2 dist cumdist