我有一个数据集,其中包含13年内不同国家/地区的动物记录,x y坐标(以米为单位)和发现动物的年份。我想知道如何以米为单位来测量每个点之间三个最近的邻居之间的距离,但是只能在同一调查年份的点内测量该距离。我想找出哪些位置对之间的距离小于1000m,并获取其中的csv。
我正在使用sf软件包,并且能够估计点之间的距离,但无法按年份进行子设置。我发现软件包“ spatstat”可以与“ nndist”一起使用,但是我发现设置请求的窗口并理解需要使用的点模式对象很复杂。我是R的新手,使用不同类型的对象和不同的包对我来说非常复杂,所以我想知道在sf中是否有一种简单的方法来做到这一点。不过,如果您建议使用其他软件包或其他方式,我愿意就如何最有效地执行此操作提出建议,请帮助我提供一个代码,用于将数据转换为该软件包所需的对象类型。
谢谢!
trial <-read.table(text =
"Country station_code lat_laea lon_laea year
Belize BF09-1 -2955950 1247610 2009
Belize BF09-10 -2953600 1248590 2009
Belize BF09-11 -2954620 1247900 2009
Belize BF11-13 -2958360 1244020 2011
Belize BF11-18 -2963740 1240290 2011
Belize BF11-19 -2963380 1242020 2011
Costa BraulioCarrilloNP-C16 -3640760 1821170 2011
Costa BraulioCarrilloNP-C17 -3640730 1823240 2011
Costa BraulioCarrilloNP-C18 -3642140 1817560 2011
Guatemala 40063 -3178260 1249780 2009
Guatemala 40596 -3183800 1246940 2009
Guatemala 43279 -3182640 1251560 2009",
header = TRUE)
trial.sp <- st_as_sf(trial, coords = c("lat_laea", "lon_laea"), crs = 3035)
plot(st_geometry(trial.sp))
test <- st_distance(trial.sp, trial.sp, by_element = FALSE, which = "Euclidean")
class(test)
test1 <- as.data.frame(test)
write_csv(test1, "test.csv")
我想要的是一个csv文件,该文件具有同一学习年份的所有成对位置,并且彼此之间的距离都小于1000m。
答案 0 :(得分:1)
sf
软件包很容易集成到dplyr
框架中。这样会在trial.sp
中的每个点周围创建一个半径为1000 m的圆,并通过st_within
函数将其连接到原始数据集。
trial.sp %>%
st_join(trial.sp %>% st_buffer(dist = 1000), join = st_within) %>%
filter(year.x == year.y)
这包括在1000 m距离内没有其他站的所有站。他们只是加入了自己。如果您要删除这些内容,可以执行以下操作:filter(year.x == year.y & station_code.x != station_code.y)