确定另一个点半径内的最大点?

Identify the largest point within the radius of another point?

使用此示例数据了解我的意思

tag <- as.character(c(1,2,3,4,5,6,7,8,9,10))

species <- c("A","A","A","A","B","B","B","C","C","D")

size <- c(0.10,0.20,0.25,0.30,0.30,0.15,0.15,0.20,0.15,0.15)

radius <- (size*40)

x <- c(9,4,25,14,28,19,9,22,10,2)

y <- c(36,7,15,16,22,24,39,20,34,9)

data <- data.frame(tag, species, size, radius, x, y)


# Plot the points using qplot (from package tidyverse)
qplot(x, y, data = data) +
  geom_point(aes(colour = species, size = size))

现在你可以看到情节了,我想做的是对每个单独的“物种 A”点,我想确定 size*40 半径内的最大点。

例如,在图的左下角,您可以看到物种 A(标签 2)会产生足够大的半径以包含接近的物种 D 点。

但是,绘图最右侧的物种 A 点(标签 3)会产生足够大的半径以包含相近的物种 B 和物种 C 点,在这种情况下,I' d 想要某种输出来识别物种 A 半径内最大的个体。

我想知道我可以运行(如果有的话)在此数据集上找到每个物种 A 点的最大“半径内”点并获得如下输出:

物种A点----半径内最大点

物种 A 标签 1 ----- 物种 C 标签 9

物种 A 标签 2 ----- 物种 D 标签 10

物种 A 标签 3 ----- 物种 B 标签 5

物种 A 标签 4 ----- 物种 C 标签 8

我过去曾使用 spatstat 和 CTFspackage 绘制过一些图,但我不知道如何"find largest neighbor within radius"。也许我可以在 ArcMAP 中解决这个问题?此外,这只是一个小示例数据集。实际上,我会想要找到 "largest neighbor within radius" 以获得数千点。

如有任何帮助或反馈,我们将不胜感激。

以下为每个物种找到给定半径内的最大物种和标签对。

all_df <- data # don't wanna have a variable called data
res_df <- data.frame()
for (j in 1 : nrow(all_df)) {

  # subset the data
  df <- subset(all_df, species != species[j])
  # index of animals within radius
  ind <- which ((df$x - x[j])^2 +  (df$y - y[j])^2 < radius[j]^2 )

  # find the max `size` in the subset df
  max_size <- max(df$size[ind])
  # all indices with max_size in df
  max_inds <- which(df$size[ind] == max_size)
  # pick the last one is there is more than on max_size  
  new_ind <- ind[max_inds[length(max_inds)]]

  # results in data.frame
  res_df <- rbind(res_df, data.frame(org_sp = all_df$species[j], 
                                     org_tag = all_df$tag[j], 
                                     res_sp = df$species[new_ind], 
                                     res_tag = df$tag[new_ind]))
}

res_df
#      org_sp org_tag res_sp res_tag
# 1       A       1      C       9
# 2       A       2      D      10
# 3       A       3      B       5
# 4       A       4      C       8
# 5       B       5      A       3
# 6       B       6      C       8
# 7       B       7      C       9
# 8       C       8      B       5
# 9       C       9      B       7
# 10      D      10      A       2