【问题标题】:get distm results in column rather than matrix在列而不是矩阵中获取 distm 结果
【发布时间】:2018-12-21 03:14:35
【问题描述】:

我正在尝试计算两组不同位置(总共 145 个)之间的距离,但输出是一个矩阵,而不是一列值。

我的数据框如下所示:

head(df)
  site1   Lon1          Lat1      site2         lon2      lat2
1   TN    -64.33788     45.90501  BennettMeadow  -72.47   42.68
3   TN    -64.33788     45.90501   45.91:-64.34  -64.34   45.91
4   TN    -64.33788     45.90501    45.9:-64.36  -64.36   45.90
5   TN    -64.33788     45.90501   45.91:-64.35  -64.35   45.91
6   TN    -64.33788     45.90501   45.89:-64.34  -64.34   45.89
7   TN    -64.33788     45.90501    45.9:-64.32  -64.32   45.90

我使用 distm 进行计算,但输出是一个矩阵,而不是一个包含 145 个值的向量(每对坐标组一个)。

dist <- distm(df[2:3], df[5:6], fun = distGeo)

head(dist[,1:5])
         [,1]     [,2]     [,3]     [,4]     [,5]
[1,] 740870.5 578.1295 1804.444 1091.421 1676.753
[2,] 740870.5 578.1295 1804.444 1091.421 1676.753
[3,] 740870.5 578.1295 1804.444 1091.421 1676.753
[4,] 740870.5 578.1295 1804.444 1091.421 1676.753
[5,] 740870.5 578.1295 1804.444 1091.421 1676.753
[6,] 740870.5 578.1295 1804.444 1091.421 1676.753

编辑:

看起来 diag(dist) 可以解决问题。

【问题讨论】:

  • 谢谢@Dave2e。如果您想将其写为答案,那么我可以接受。

标签: r geosphere


【解决方案1】:

我认为您想要 distGeo 函数而不是 distm 函数。

distGeo 函数将找到两个向量中每对点之间的距离,从而得出向量结果。
distm 函数将计算第一个向量中的每个元素与第二个向量中的每个元素之间的距离,从而得到一个“m x n”矩阵。

distGeo(df[,2:3], df[,5:6])
#[1] 740870.5772    578.5153   1804.5629   1091.7911   1676.4440   1495.0507


distm(df[2:3], df[5:6], fun = distGeo)
#         [,1]     [,2]     [,3]     [,4]     [,5]     [,6]
#[1,] 740870.6 578.5153 1804.563 1091.791 1676.444 1495.051
#[2,] 740870.6 578.5153 1804.563 1091.791 1676.444 1495.051
#[3,] 740870.6 578.5153 1804.563 1091.791 1676.444 1495.051
#[4,] 740870.6 578.5153 1804.563 1091.791 1676.444 1495.051
#[5,] 740870.6 578.5153 1804.563 1091.791 1676.444 1495.051
#[6,] 740870.6 578.5153 1804.563 1091.791 1676.444 1495.051 

【讨论】:

    【解决方案2】:

    as.vector 将矩阵转换为向量(按列):

    as.vector(dist)
    

    或者如果你想要逐行:

    as.vector(t(dist))
    

    如果您需要保留坐标,一种方法是:

    df <- as.data.frame(dist) 
    names(df) <- c("dist.1", "dist.2")
    reshape(data = df, direction = "long", varying = 1:2)
    

    或者,您可以使用坐标命名列:

    reshape(data = df, direction = "long", varying = 1:2, timevar = "x", idvar = "y")
    

    【讨论】:

    • 不幸的是,这仍然不能帮助我排列成对的坐标。
    • 谢谢,但这比其他解决方案要复杂一些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2014-10-19
    • 2014-02-08
    • 2018-01-12
    • 1970-01-01
    相关资源
    最近更新 更多