从data.frame计算值之间的距离时出错

时间:2018-12-16 12:40:38

标签: r geosphere

我正在尝试计算作为data.frame子集的不同点之间的距离。

我尝试使用的方法是来自库distHaversine的{​​{1}}。 我将数据存储在var geosphere中,并尝试使用以下功能:

st

distHaversine(st[1,c(3,2)],st[2,c(3,2)]) 中的每一行都是新地点的条目,第3列是经度,第2列是纬度。 以这种方式使用该函数会给我以下错误:

st

读取错误,例如:

Error in .pointsToMatrix(p1) * toRad : 
  non-numeric argument to binary operator

类似的声音应该可以解决问题,但这只会给我带来另一个错误:

distHaversine(as.double(st[1,c(3,2)]),as.double(st[2,c(3,2)]))

如果我手动将lat和long in添加到函数中,例如:

Error in .pointsToMatrix(p1) : latitude > 90

它有效并返回distHaversine(c(12.6959,60.3097),c(12.6959,60.3097))

0st[1,c(3,2)]的输出如下:

st[2,c(3,2)]

longitude latitude 1 12.6959 60.3097 longitude latitude 2 12.6959 60.3097 的输出:

dput(st[1:2, 2:3])

2 个答案:

答案 0 :(得分:4)

正如@IceCreamToucan所说,问题是您的纬度和经度是因子变量。要解决此问题,您可以使用

df$latitude <- as.numeric(as.character(df$latitude))
df$longitude <- as.numeric(as.character(df$longitude))
distHaversine(df[1,], df[2,])
# [1] 0

重要的是为什么会发生这种情况。特别是,我们有

levels(df$latitude)
#  [1] " latitude"   "55.3376" ...

因此,在latitude列中必须有一个以“纬度”作为值的行。结果,在加载数据时,此变量成为一个因素。同样,

levels(df$longitude)
# [1] " longitude"  "11" ...

答案 1 :(得分:0)

我会大胆猜测st是一个包含文本数据的矩阵,因此所有数据都被强制为char。尝试将数据对象重建为data.frame(允许多种数据类型),看看问题是否仍然存在。

> st <- data.frame(name=c("A","B"), latitude = 12.6959, longitude = 60.3097)
> st
  name latitude longitude
1    A  12.6959   60.3097
2    B  12.6959   60.3097
> geosphere::distHaversine(st[1,c(3,2)],st[2,c(3,2)])
[1] 0

除了我同意@ julius-vainora编写的所有内容之外。