我正在尝试计算两组不同位置(总共 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)可以解决问题。
我认为你想要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
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")