我有一个大约有 50 个 ID 的 df。每个ID都有多组坐标,我想删除距该ID的第一个位置超过8公里距离的任何一组坐标。 数据看起来像这样。
ID Easting Northing Date
1 593853 5255971 1/24/2008
1 593660 5253841 1/28/2008
1 594513 5253841 2/3/2008
2 583242 5258672 1/21/2008
2 583436 5258031 1/22/2008
3 593983 5258470 1/21/2008
3 591849 5258471 1/24/2008
3 591784 5258974 1/26/2008
3 591984 5258093 1/29/2008
4 591948 5259012 2/4/2009
4 591947 5259016 2/15/2008
4 578452 5261983 2/17/2008
所以我想将 ID 1 的所有坐标与 ID 1 的第一个坐标进行比较,如果距离 >8 公里,则删除该行。
proj4string <- CRS("+proj=utm +zone=15 +ellps=WGS84 +datum=WGS84 +units=m +no_defs")
任何帮助将不胜感激。
假设 UTM 以米为单位,这从分组计算开始,然后您可以使用您想要的任何方言进行过滤/子集。
library(dplyr) # > 1.1.0 for .by, use group_by(.) if older
quux %>%
mutate(dist_km = sqrt((Easting - Easting[1])^2 + (Northing - Northing[1])^2)/1000, .by = ID)
# ID Easting Northing Date dist_km
# 1 1 593853 5255971 1/24/2008 0.000000000
# 2 1 593660 5253841 1/28/2008 2.138726023
# 3 1 594513 5253841 2/3/2008 2.229910312
# 4 2 583242 5258672 1/21/2008 0.000000000
# 5 2 583436 5258031 1/22/2008 0.669714118
# 6 3 593983 5258470 1/21/2008 0.000000000
# 7 3 591849 5258471 1/24/2008 2.134000234
# 8 3 591784 5258974 1/26/2008 2.256017952
# 9 3 591984 5258093 1/29/2008 2.034239416
# 10 4 591948 5259012 2/4/2009 0.000000000
# 11 4 591947 5259016 2/15/2008 0.004123106
# 12 4 578452 5261983 2/17/2008 13.819148201
您可以选择
filter(dist_km <= 8)
或直接对 sqrt(...)
计算进行过滤,而不将其存储为列。
transform(quux,
dist_km = ave(seq(nrow(quux)), ID, FUN = function(ind) {
sqrt((Easting[ind]-Easting[1])^2+(Northing[ind]-Northing[1])^2)
}) / 1000)
# ID Easting Northing Date dist_km
# 1 1 593853 5255971 1/24/2008 0.000000
# 2 1 593660 5253841 1/28/2008 2.138726
# 3 1 594513 5253841 2/3/2008 2.229910
# 4 2 583242 5258672 1/21/2008 10.949371
# 5 2 583436 5258031 1/22/2008 10.618733
# 6 3 593983 5258470 1/21/2008 2.502379
# 7 3 591849 5258471 1/24/2008 3.204062
# 8 3 591784 5258974 1/26/2008 3.646748
# 9 3 591984 5258093 1/29/2008 2.827728
# 10 4 591948 5259012 2/4/2009 3.588413
# 11 4 591947 5259016 2/15/2008 3.592334
# 12 4 578452 5261983 2/17/2008 16.532844