删除 df 中每个 ID 距原始位置 >8 公里的位置

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

我有一个大约有 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")

任何帮助将不胜感激。

r coordinates distance spatial
1个回答
3
投票

假设 UTM 以米为单位,这从分组计算开始,然后您可以使用您想要的任何方言进行过滤/子集。

dplyr

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(...)
计算进行过滤,而不将其存储为列。

基础R

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
© www.soinside.com 2019 - 2024. All rights reserved.