second, third, .. 具有 apply 功能的索引

The index of second, third,.. min with apply function

我有一个函数,用于计算 lat/long 坐标(在 SpatialPoints 中)和另一个坐标向量(也在 SpatialPoints 中)之间的最小距离的索引。我用来查找最小距离的函数是:

library(rgeos)
dfdist$mindist <-apply(gDistance(sp1, sp2, byid=TRUE), 1, which.min)

上面的函数在我预先存在的数据框dfdist中给了我一列mindist,它是最小距离发生点的行号的索引。

我还想找到第 2 分钟距离和第 3 分钟距离,但不确定如何使用 apply() 执行此操作。是否有 which.min 的替代品可以给我第二分钟的索引?第三分钟?

您可以使用此用户定义的函数来执行此操作:

f_which.min <- function(vec, idx) sort(vec, index.return = TRUE)$ix[idx]

所以你可以使用:

apply(gDistance(sp1, sp2, byid=TRUE), 1, f_which.min, idx = 1) 

相应地设置参数 idx。也就是说,idx=1 第一分钟,idx=2 第二分钟等等。

我会使用如下函数:

which_nmin <- function(x, n = 1) 
{
  ux <- unique(x)
  ux <- ux[order(ux)][n]
  which(x == ux)
}

which_nmin(c(1, 1, 1, 1:5), 3)


which_nmax <- function(x, n = 1) 
{
  ux <- unique(x)
  ux <- ux[order(ux, decreasing = TRUE)][n]
  which(x == ux)
}

which_nmax(c(1, 1, 1, 1:5), 2)

您的 apply 电话是

apply(gDistance(sp1, sp2, byid=TRUE), 1, which_nmin, n = 2)