我正在尝试计算作为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))
。
0
和st[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])
答案 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编写的所有内容之外。