一种方法是使用raster 包中的distance(),在使用包将矩阵转换为使用raster() function 的RasterLayer 对象之后。
这个包是为地图设计的,所以当你使用raster()时,你的对象会有单位、分辨率等。因此,当你使用distance()时,距离一个元素的距离可能非常大非 NA(对我来说是 15796.35)。只需除以这个数量(可能是 round() 由于舍入错误)即可得到答案。
例如,如果我有一个名为a1 的 NA 数组对象:
> a1 = array(
c(
c(1, 5, 6, NA, 1, 2, 5),
c(3, 4, NA, NA, NA, 8, 1),
c(5, 1, 7, NA, 2, 3, 7),
c(8, 1, 1, 2, 3, 6, 2)
),
c(7, 4)
)
> r1 = raster(a1)
> d1 = distance(r1)
> as.matrix(d1)
[,1] [,2] [,3] [,4]
[1,] 0.00 0.00 0.00 0
[2,] 0.00 0.00 0.00 0
[3,] 0.00 15796.35 0.00 0
[4,] 15796.33 31592.66 15796.33 0
[5,] 0.00 15796.33 0.00 0
[6,] 0.00 0.00 0.00 0
[7,] 0.00 0.00 0.00 0
> round(
as.matrix(d1) / 15796.35,
0
)
[,1] [,2] [,3] [,4]
[1,] 0 0 0 0
[2,] 0 0 0 0
[3,] 0 1 0 0
[4,] 1 2 1 0
[5,] 0 1 0 0
[6,] 0 0 0 0
[7,] 0 0 0 0
你的答案是什么。不过,我不知道distance() 函数背后的代码效率如何,所以我不知道它是否需要一段时间。
编辑:在具有 29000 个 NA 的数组对象上进行了测试,需要很长时间。我建议您仅将其用于具有少量 NA 的对象。