计算二维欧几里得距离并将其作为列添加到数据中

Posted

技术标签:

【中文标题】计算二维欧几里得距离并将其作为列添加到数据中【英文标题】:Calculating two dimensions Euclidean distance and adding it as a column in the data 【发布时间】:2021-12-22 19:30:55 【问题描述】:

我需要创建一个变量来测量与 APP 的距离。 APP的中心在坐标1440000东,12160000北。 我需要创建一个新列来计算每个人与APP(dist.APP)中心之间的欧几里得距离。

这是我目前所拥有的,但我不确定方程式是否适用于二维:

east = "1440000"

north = "12160000"

b1 = east
b2 = north

dist.APP <- function(a1, b1, a2, b2) sqrt((a1 - b1)^2 + (a2 - 
b2)^2)
  apply(datwolfcoy, FUN = dist.APP, MARGIN = 2)
  

你是这样指定APP坐标中心的向量的吗?

为了将它添加为每个人的列,这不太奏效,我认为它适用于所有列,而不仅仅是我指定的个人(边距 = 2)。

我也试过这个,但没有运气:

dist.APP <- data.frame(function(a1, b1, a2, b2) sqrt((a1 - b1)^2 + (a2 - b2)^2)

这是我的数据的样子:

ID  PackNumber  StudyArea   CoyoteAncestry(Logit)   PrimaryRds  SecondaryRds    TertiaryRds  Deer   Moose   east    north
49-2    1   Out -0.834473518    0.088   0.499   0.015   0.087   0.112   1358690 12086700
49-3    2   Out -2.408854287    0   0.302   0.188   0   0.382   1346840 12099300
49-4    2   Out -3.896934876    0   0.5 0.164   0.057   0.385   1343380 12100000
49-7    2   Out -2.699548556    0   0.5 0.164   0.057   0.385   1343380 12100000

【问题讨论】:

二维空间不需要sum。你的意思是:euclidean.dist &lt;- function(a1, b1, a2, b2) sqrt((a1 - b1)^2+(a2 - b2)^2) 糟糕!谢谢你。是的,这就是我的意思。我不知道为什么我把总和。 请记住,地球不是平的。欧几里得距离意味着您愿意挖掘隧道以采用从 A 到 B 的最短路径。您可能希望使用半正弦距离。还要记住,有不同的坐标系会影响距离的单位。 谢谢。但是,我确实很欣赏,为了练习,我们被要求使用欧几里得距离。但我也会研究一下半角距离。 【参考方案1】:

一个可能的解决方案:

df <- data.frame(
         stringsAsFactors = FALSE,
              check.names = FALSE,
                       ID = c("49-2", "49-3", "49-4", "49-7"),
               PackNumber = c(1L, 2L, 2L, 2L),
                StudyArea = c("Out", "Out", "Out", "Out"),
        `CoyoteAncestry(Logit)` = c(-0.834473518,-2.408854287,-3.896934876,
                                    -2.699548556),
               PrimaryRds = c(0.088, 0, 0, 0),
             SecondaryRds = c(0.499, 0.302, 0.5, 0.5),
              TertiaryRds = c(0.015, 0.188, 0.164, 0.164),
                     Deer = c(0.087, 0, 0.057, 0.057),
                    Moose = c(0.112, 0.382, 0.385, 0.385),
                     east = c(1358690L, 1346840L, 1343380L, 1343380L),
                    north = c(12086700L, 12099300L, 12100000L, 12100000L)
      )

euc.dist <- function(x)
  
  sqrt((1440000-x[1])^2 + (12160000-x[2])^2)
  
  
df <- cbind(df, dist = apply(df[,c("east", "north")],1, euc.dist))

#>     ID PackNumber StudyArea CoyoteAncestry(Logit) PrimaryRds SecondaryRds
#> 1 49-2          1       Out            -0.8344735      0.088        0.499
#> 2 49-3          2       Out            -2.4088543      0.000        0.302
#> 3 49-4          2       Out            -3.8969349      0.000        0.500
#> 4 49-7          2       Out            -2.6995486      0.000        0.500
#>   TertiaryRds  Deer Moose    east    north     dist
#> 1       0.015 0.087 0.112 1358690 12086700 109472.4
#> 2       0.188 0.000 0.382 1346840 12099300 111190.3
#> 3       0.164 0.057 0.385 1343380 12100000 113734.0
#> 4       0.164 0.057 0.385 1343380 12100000 113734.0

【讨论】:

以上是关于计算二维欧几里得距离并将其作为列添加到数据中的主要内容,如果未能解决你的问题,请参考以下文章

百度地图高级开发:map.getDistance计算多点之间的距离并输入矩阵

如何给 sns.clustermap 一个预先计算的距离矩阵?

matlab的pdist函数详解

将 Haversine 结果作为双精度类型添加到数据集

常用距离计算方法:

欧几里得距离(python3,sklearn):有效地计算最近的对及其对应的距离